Embedded apps

A folder with an index.html at its root and no index.md is treated as an embedded app. Cabinet renders it in an iframe inside the main panel.

Standard embedded app

The app renders in the main content area; the sidebar and AI panel stay visible. Good for dashboards and reference tools you want to glance at while writing or doing other work.

data/
  my-dashboard/
    index.html
    style.css
    app.js
    data.json

Click my-dashboard/ in the sidebar — it opens as a live page.

Full-screen app

Add a .app marker file (empty file, just to flag it) and Cabinet expands the iframe to full screen, hiding the sidebar:

data/
  my-launch-room/
    .app             ← marker (empty file)
    index.html
    app.js

Use full-screen for immersive tools — pipeline dashboards, custom Kanban boards, embedded apps you want to feel like a Cabinet page rather than an iframe.

What you can build

Anything that runs in a browser. Common patterns:

PatternExample
Read-only dashboardPipeline dashboard reading ../data/pipeline.csv via fetch
Custom widgetA budget calculator with sliders that writes back to ../config.json
Mini-game / sandboxA quick prototype to share with the team
Demo for a clientSelf-contained, no auth, just a folder you ship
Embedded data vizD3 / Chart.js / Plotly reading from cabinet files

Reading other cabinet files from the iframe

Embedded apps can read sibling files via relative fetch:

<script>
  // From data/my-dashboard/index.html
  fetch("../pipeline.csv")
    .then(r => r.text())
    .then(text => render(text));
</script>

Cabinet's web server serves the cabinet folder as static files, so any text or asset is fetchable.

Limits

  • No npm install. Embedded apps are self-contained. Use CDN imports if you need a library.
  • The iframe is sandboxed. No clipboard write without user gesture, no popups, no top-window navigation.
  • The app can't write outside the cabinet folder. Reads are scoped to the cabinet root.

Why this matters

Cabinet folds in "the dashboard" as another file type. You don't have to deploy a separate web app to put a custom view next to your data. Drop a folder, edit the HTML, refresh the page — the dashboard updates.

Read on