# Cabinet Public Docs Full Text ## Welcome to Cabinet URL: https://runcabinet.com/ Welcome to Cabinet Your Knowledge Base, your AI Team. Local first. Markdown backed. Yours. Cabinet collapses your notes, files, tasks, and AI agents into one folder on your computer . You open one app — everything is there. You close your laptop — your AI team keeps working. Cabinet in three ideas One folder for everything. Notes, PDFs, spreadsheets, code, diagrams, embedded apps — first class viewers, no juggling tools. If it lives in a folder, Cabinet can show it. An AI team that lives next to your work. Hire personas. Give them skills. Schedule tasks, routines, and heartbeats. Their outputs land back in your folder as durable pages — not lost in a chat transcript. Yours, on disk, forever. Plain markdown plus a tiny manifest. Git trackable. Bring your own AI provider — Claude, GPT, Gemini, Grok, or a local model . No database. No cloud. No lock in. Pick your path I want to use Cabinet. Install Cabinet — five minutes from zero to running. What is a Cabinet? — the three tabs of the app, in plain language. Markdown editor — slash menu, links, mentions, the works. Meet your AI team — personas, skills, tasks, routines, heartbeats. I want to understand or extend it. Philosophy — the 90 second pitch. Why one folder beats a stack of tools. Concepts — the app, the file format, the AI team model. Reference — CLI, file structure, manifest / persona / job / skill schemas. Bring your own AI — wire up Claude, GPT, Gemini, Grok, or Ollama. Browse a ready made AI team cabinets.sh is a public registry of plug and play cabinets — a complete AI team for a job hunt, a solo startup, a wedding, a podcast, a property portfolio. Clone one folder, run one command: Open it in Cabinet. Every agent, every job, every page is already there. Edit a persona, change a schedule, make it yours. Cabinet is in active development. See the Roadmap for what's stable, what's experimental, and what's coming next. ## What is a Cabinet? URL: https://runcabinet.com/cabinet/ What is a Cabinet? A cabinet is a folder on your computer + an app for working with it . The folder holds your knowledge. The app gives you three ways to work with it. Open Cabinet and you see three tabs — the same three you'll see across these docs. Have more than one area of work? Your home holds several cabinets you switch between like rooms (office, study, personal), each its own isolated workspace. The three sides of a Cabinet Data. Your file tree. Notes, PDFs, spreadsheets, code, diagrams, images, embedded apps — everything in one browseable folder, with a rich markdown editor and first class viewers. → Read more about Data Agents. Your AI team. Personas with goals, skills, and memory who live in the same folder as your work. Bring your own model. → Read more about Agents Tasks. What the team does. One off tasks, scheduled routines, and recurring heartbeats — outputs land back in your folder as durable pages. → Read more about Tasks Why the three together A scattered tool stack means scattered context. An assistant in ChatGPT can't see your meeting notes. An agent in Linear can't see your research. A scheduled job in Zapier can't write back into your brain. Cabinet's bet is that knowledge, the workforce, and the work all have to live in the same folder for any of it to compound. ## Agents URL: https://runcabinet.com/cabinet/agents/ Your AI team A Cabinet agent is a markdown file with a heartbeat . The file lives at .agents/<slug>/persona.md . Edit it, and the agent updates. Delete it, and the agent disappears. Git tracks every change. That's the whole mental model. Everything below is what those files can do. What an agent has | Piece | What it is | Where it lives | | | | | | Persona | The system prompt + identity | .agents/<slug>/persona.md | | Memory | Things the agent has learned about you and the work | .agents/<slug>/memory.md | | Heartbeats | Recurring check ins on a schedule | YAML inside persona.md | | Skills | Reusable instruction packs the agent can pull in | .agents/skills/<name>/SKILL.md | | Workspace | Where their outputs land | Any folder you point them at | | Model | Which provider runs them | Set in persona.md , override per task | Three rhythms a team runs on A task is one piece of work that runs once. A routine is a task on a schedule. A heartbeat is a recurring check in the agent uses to decide what to do next. Heartbeats are the difference between an assistant you have to summon and a teammate who shows up. The dispatch and approval loop A lead agent can propose work for the rest of the team — launch a task for the researcher, schedule a job for the marketer, queue a one off for the editor. Every proposal goes through the Approval Queue before anything runs. You approve, change the model or effort, or reject. Read on Persona — the full persona.md schema. Heartbeats — recurring check ins. Routines — scheduled tasks. Tasks — the kanban board. Conversations & approvals — the safety story. Delegating between agents — leads, specialists, departments. Skills — installable instruction packs. BYOAI — bring your own AI provider. ## Bring your own AI URL: https://runcabinet.com/cabinet/agents/byoai/ Bring your own AI Cabinet doesn't host inference. You connect the providers you already pay for , and Cabinet routes your agents' calls to them. There's no Cabinet middleman, no inference markup, no opaque quota. You pay your own bill, you use your own quota. Supported providers today Cabinet runs through a provider adapter layer . As of v0.4.0 , eight CLI providers ship in the default runtime — all local, so your prompts go through a tool you've already installed and authenticated: | Adapter | Provider | Install | | | | | | claude local | Anthropic Claude (via Claude Code CLI) | npm install g @anthropic ai/claude code | | codex local | OpenAI GPT (via Codex CLI) | npm install g @openai/codex or brew install cask codex | | gemini local | Google Gemini (via Gemini CLI) | See provider docs | | opencode local | OpenCode | See provider docs | | pi local | Pi (Inflection) | See provider docs | | | + 3 more CLI providers | See provider settings in app | You need at least one CLI installed. The defaults Cabinet boots with are claude local and codex local ; everything else turns on per agent. Each adapter has shared runtime controls — model picker, effort sliders, dynamic listModels() , brand icons. Coming next Direct API access (no CLI required) and more open weights models are on the way: | Provider | How it'll connect | Status | | | | | | Hermes (Nous) | Local via Ollama | Planned | | Llama / Mistral / Qwen | Local via Ollama | Planned | | LM Studio | Local, no key | Planned | | Anthropic API (direct) | API key, no CLI required | Planned | | OpenAI API (direct) | API key, no CLI required | Planned | | xAI Grok (direct) | API key | Planned | | Image generation | FLUX, DALL·E, local SD | Planned | Track progress on the Roadmap. Why a mix of models Most AI products lock you to one model behind one API. Cabinet's bet is the opposite: your team should be a mix of models , picked per job. The strategy lead runs on Opus because it writes carefully. The triage agent runs on Haiku because it's cheap and fast. The local agent runs on a local model because the data is sensitive. Same cabinet, different brains. What each provider is good for | Provider | Strengths | When to pick | | | | | | Anthropic Claude | Long careful writing, strong reasoning, big context | Defaults for leads, editors, anything where tone matters | | OpenAI GPT | Fast, cheap, strong tool use | Triage, dispatchers, high volume routine work | | Google Gemini | Long context, low cost per token, vision | Research synthesis, document QA, long form summaries | | xAI Grok | Fresh news access, lighter touch | Trend analysts, social listening | | Local (Ollama / LM Studio) | Offline, private, free | Sensitive data, air gapped work, hobby experiments | Setting an agent's model In persona.md : Or override per task at the composer: Or per heartbeat: Routing rules In .cabinet you can set global routing : If a request hits a budget cap or a 429, Cabinet falls back to the next model in the list and writes a note in the run transcript. What Cabinet never does Forwards your prompts to a Cabinet hosted backend. Caches your prompts for "model improvement." Charges you for inference. Locks you to a provider after install. If you delete your API key, the provider disappears. Your prompts and outputs stay in your cabinet folder, on your disk. Local only mode Want every call to stay on your machine? Set providers.localOnly: true in .cabinet : Cabinet refuses any non local provider. If an agent's persona points at claude opus 4 8 , the run errors with a clear "local only" message instead of silently falling through. Read on Persona — where you set an agent's model. Routines — per routine model overrides. Tips → Performance & cost — the cheap fast / careful slow recipe. ## Conversations & approvals URL: https://runcabinet.com/cabinet/agents/conversations-and-approvals/ Conversations & approvals Cabinet's safety story is one rule: no agent acts on another agent's behalf without your approval. When a lead decides the researcher should brief a competitor, or the editor should polish a draft, or the marketer should run a weekly post batch, that decision becomes a proposal in the Approval Queue. You see who proposed what, to whom, with which model and effort. You approve, change settings inline, or reject. What can be proposed Three action types. Same approval surface for all of them. | Action | What it creates | Default approval | | | | | | LAUNCH TASK | A task in the kanban Inbox | required | | SCHEDULE JOB | A new YAML in .jobs/ | required | | SCHEDULE TASK | A one off task at a future time | required | You can auto approve low impact proposals (e.g., LinkedIn post drafts under $0.10) by setting policy in .cabinet : Anything outside policy still queues. There's no global "trust this agent forever" toggle , on purpose. What you see in the queue For each proposal: Kind — LAUNCH TASK / SCHEDULE JOB / SCHEDULE TASK From → To — proposing agent and target agent Title + detail — what they want to run Model — defaults to the target agent's model, but editable inline Effort — low / medium / high, editable Schedule (for SCHEDULE ) — cron string, editable Estimated cost — token estimate × current model price You can change any of those before approving . A common move: a lead suggests Opus + high effort for a quick task; you downgrade to Sonnet + medium and approve. Why this matters Most agent platforms either: 1. Run everything autonomously and let you find out later, or 2. Make every action a chat turn you have to babysit. Cabinet sits in the middle. Agents propose, you approve. The lead can plan a whole week's work in one turn, you scan the queue in 30 seconds and ship it, and the team executes without further interruption. The proposal queue is the seam where human judgment lives. Where conversations live Every approval (and every chat with an agent) is a durable conversation stored under .chat/ . You can: Re read any past chat — they're plain text on disk. Search them with ⌘K . Reference a past chat from a new prompt with @chat:slug . Convert a chat into a routine if you find yourself re running it. .chat/ is git ignored by default — chats can be long and noisy — but you can opt in per cabinet if you want them version tracked. Manual conversations You can also chat with an agent directly. Click their avatar in the AI team panel: Cmd+Shift+A opens the agent panel for the current page (the agent reads the page as context). The agent panel is a normal chat, but @ mentions can pull in any page or folder as context. If the agent decides the conversation should turn into work, they propose a task — same approval flow. Manual chats don't auto write to the cabinet. You decide whether the conversation becomes a page (use /save ) or stays in .chat/ . Read on Delegating between agents — what canDispatch: true actually unlocks. Tasks — where approved proposals land. Routines — what an approved SCHEDULE JOB becomes. ## Heartbeats URL: https://runcabinet.com/cabinet/agents/heartbeats/ Heartbeats A heartbeat is the difference between an assistant you have to summon and a teammate who shows up. It's a cron scheduled prompt attached to a persona. Every weekday at 9am, every Friday at 5pm, every hour, whatever — at that moment Cabinet wakes the agent, hands them the prompt, and lets them decide whether anything needs doing. If nothing changed, the heartbeat ends silently. If something needs your attention, it shows up in the Approval Queue or as a new page in the cabinet. Heartbeats vs. routines vs. tasks Three rhythms. They look similar. They're different on purpose. | | When | What it is | What it produces | | | | | | | Task | Once | A specific piece of work | A page, a draft, a result | | Routine | On a schedule | A task that recurs | The same thing, every Friday | | Heartbeat | On a schedule | A check in to decide what to do | Maybe nothing. Maybe a proposal. Maybe a page. | A routine knows what it'll produce. A heartbeat doesn't. The agent looks around and decides. The shape of a heartbeat Heartbeats live in the persona's frontmatter: Three fields per beat: cron — standard 5 field cron expression. Use crontab.guru if you need a translator. label — optional name shown in the schedule UI. prompt — what the agent reads when the heartbeat fires. Common cron patterns | Pattern | Reads as | Good for | | | | | | 0 9 1 5 | weekdays at 9am | Morning standup | | 0 17 5 | Fridays at 5pm | Weekly wrap | | 30 11 1 5 | weekdays at 11:30 | Pre lunch sweep | | 0 /4 | every 4 hours | Inbox / feed scanner | | /15 9 18 1 5 | every 15 min, business hours, weekdays | High frequency monitoring | | 0 0 1 | 1st of every month | Monthly report | What a heartbeat sees When a heartbeat fires, the agent gets: 1. The prompt from the heartbeat. 2. The agent's persona prompt . 3. Their memory file. 4. Whatever folder is in scope (their visibility ). That's it. No conversation history, no other agents, no full cabinet read. Heartbeats are intentionally tight. They run quickly, they cost less, and they're predictable. If the agent decides work needs to happen, it can: Write a page (e.g., a daily briefing). Propose a task or job → goes to the Approval Queue. Update memory and exit. Do nothing and exit. Designing a heartbeat that doesn't get annoying A heartbeat that pings you every time it runs gets muted within a week. Two rules: Tip — Default to silence. Write the prompt so the agent only escalates new or important findings. Encourage it to update its memory and stay quiet otherwise. Tip — Anchor to a file, not a topic. "Check /sales/pipeline.csv" beats "Check on sales." A heartbeat that has a specific page to read writes a specific page back. Bad heartbeat: Better: Pausing a heartbeat Three options, in order of permanence: 1. Disable — open the agent in the AI team panel, click the heartbeat, toggle it off. Reversible in one click. 2. Comment it out — open persona.md , prefix the YAML line with . Git trackable. 3. Delete — remove the array entry. Done. Heartbeats also auto pause when the cabinet is closed. They resume the next time the app boots — they're not background daemons. Read on Persona — where heartbeats are declared. Routines — when you want a specific task to recur, not just a check in. Conversations & approvals — what happens when a heartbeat proposes work. ## Org chart & departments URL: https://runcabinet.com/cabinet/agents/org-chart-and-departments/ Org chart & departments A Cabinet team is a tree. Departments are folders, leads sit at the top, specialists sit underneath. Leads can dispatch work down. Specialists do focused work. Every dispatch goes through the Approval Queue before it runs. How the tree gets built Two things define the tree: 1. The folder structure under .agents/ — sub folders become departments. 2. The type field in each persona.md — lead goes up, specialist goes underneath. That's it. No manifest, no graph DSL. Move a folder, the org changes. What a lead can do that a specialist can't | Capability | Lead | Specialist | | | | | | Run their own tasks | ✓ | ✓ | | Be @ mentioned by you | ✓ | ✓ | | Have heartbeats and routines | ✓ | ✓ | | Propose LAUNCH TASK to other agents | ✓ | opt in via canDispatch | | Propose SCHEDULE JOB | ✓ | opt in | | See other agents' memory | opt in | no | | Cross department boundaries when dispatching | with policy | no | A specialist stays in its lane . A lead can plan a week of work for the team in one turn. Dispatch — the lead's main move When a lead is reasoning through work, it can emit a structured action instead of just text: That action shows up in the Approval Queue. You see who proposed it, change settings inline, and approve or reject. Nothing runs without you. A lead can chain dispatches in one turn: "Plan the Q3 launch. Brief competitors via Research Lead. Schedule a weekly LinkedIn batch. Queue a Friday founder story pass with the Editor." The output: three queued proposals, all visible at once. You scan, approve in 30 seconds, the team executes for a week. Department visibility Each persona has a visibility field that controls what they can read: | Value | Reads | | | | | folder | Only their .agents/<dept>/ + the cabinet level pages they're explicitly given. | | cabinet | Everything in the current cabinet. (default) | | all | Everything in this cabinet AND its child cabinets. Use sparingly. | Tight visibility makes agents fast and predictable . Loose visibility makes them aware but expensive. Cross department policy By default, a lead can only dispatch within their department . Marketing can ask Marketing. Research can ask Research. Cross department dispatches require policy in .cabinet : Without an entry, the dispatch is rejected at the proposal stage with a clear "policy: not allowed" message. No surprise cross team work. A team of teams: child cabinets A child cabinet has its own .agents/ folder with its own org chart. The parent cabinet's leads can dispatch into a child cabinet only if the child explicitly opts in via its own .cabinet : This makes Cabinet practical for agencies, multi tenant work, and "departments of departments" setups. Each child stays sovereign. Read on Conversations & approvals — the queue every dispatch lands in. Persona — where type , canDispatch , and visibility are set. Templates — pre built org charts you can install in one command. ## Persona URL: https://runcabinet.com/cabinet/agents/persona/ Persona A persona is the file that is your agent. Edit it, the agent updates. Delete it, the agent disappears. Git tracks every change. The whole agent — name, model, schedule, system prompt — sits in one file at .agents/<slug>/persona.md . Hover the fields below to see what each one controls. The minimum viable persona That's a working agent. Three lines of frontmatter and a system prompt. Cabinet picks up the file the next time the app boots. Every field | Field | Type | Default | What it does | | | | | | | name | string | — | Display name in the AI team panel and @ mentions. | | emoji | string | "🤖" | Quick visual identifier in lists, mentions, and the org chart. | | role | string | — | One line subtitle. Keep it ≤3 words. | | type | "lead" \| "specialist" | specialist | Leads can dispatch work to other agents. Specialists do focused work. | | model | string | inherits cabinet default | Default provider+model. Override per task or per heartbeat. | | canDispatch | boolean | true for leads, false for specialists | Allow LAUNCH TASK / SCHEDULE JOB proposals. | | heartbeats | array | | Recurring check ins. See Heartbeats. | | memory | string \| object | "memory.md" | Where the agent's learned context lives. | | skills | string | | Skill slugs to attach by default. See Skills. | | tools | string | inherits | Allow list of tool names. Empty = inherit cabinet defaults. | | visibility | "all" \| "cabinet" \| "folder" | cabinet | How far up/down the tree this agent can read. | | budget | object | inherits | Token / dollar caps per run, per day. | The body of the file (everything after the second ) is the system prompt . Write it like you're onboarding a new hire: who they are, what they own, where their workspace is, what they should never do. Patterns that work A specialist who lives in a folder Why it works: narrow scope ( visibility: folder ), boring model (cheap, fast), one job, output goes to a durable page. A lead who orchestrates Why it works: opinionated model (Opus for strategy), explicit dispatch permission, two heartbeats that frame the week. A heartbeat only agent Why it works: no chat surface, no dispatch, just a Friday evening sweeper that gets out of your way. Memory A persona's memory file is a markdown page the agent reads at the start of every run and writes to at the end. Think of it as their notebook. You can read or edit memory.md like any other page. If the agent learns something wrong, just open the file and fix it. Sharing a persona A persona is a folder. To share one: When you publish a template to cabinets.sh, the personas come with it. Anyone who installs the template gets your team, ready to run. Read on Heartbeats — the recurring check in field, in detail. Skills — pluggable instruction packs you attach to a persona. Delegating — what canDispatch: true actually unlocks. Persona schema reference — every field, every type, every default. ## Routines URL: https://runcabinet.com/cabinet/agents/routines/ Routines A routine is a task that runs on a schedule . Same prompt, same agent, same output shape, every Friday at 5pm. While heartbeats decide what to do at a moment, routines do the same thing reliably. Where routines live Each routine is a YAML file in .jobs/ : The filename becomes the routine's slug. Add a file, the routine appears. Delete it, the routine disappears. Git tracks it. A complete routine Every field | Field | Type | Required | What it does | | | | | | | schedule | cron string \| "manual" | yes | When the routine fires. Use manual for run on button. | | ownerAgent | agent slug | yes | Which persona runs it. Inherits their model, tools, and memory. | | enabled | boolean | no (default true ) | Off without deleting. | | title | string | yes | Shown in the schedule UI and approval logs. | | prompt | string | yes | The instruction. Variables like $DATE , $WEEK , $YYYY WW get interpolated. | | model | string | no | Override the agent's default model for this routine. | | effort | "low" \| "medium" \| "high" | no | Reasoning effort. High = slower, more careful, more expensive. | | budget | object | no | Cap tokens or dollars per run. | | outputs | array | no | Hint Cabinet which files this routine writes. Helps with link checking. | | requiresApproval | boolean | no (default false ) | If true, queue the result before it lands. | Routines vs. heartbeats — which do I want? Pick a routine when you can describe the output before it runs: "Every Friday, summarize the week's metrics into a packet." Pick a heartbeat when you can only describe the trigger : "Every weekday morning, look at the launch room and tell me what changed — if anything ." A rough rule: if the output goes in a predictable folder structure, it's a routine. If the output might be "nothing today, sorry," it's a heartbeat. Manual routines Set schedule: "manual" for a routine you trigger from the UI: These show up as "Run" buttons in the agent's profile. Click to trigger, optionally pass arguments. Variable interpolation | Variable | Expands to | Example | | | | | | $DATE | YYYY MM DD | 2026 05 03 | | $WEEK | YYYY WW (ISO week) | 2026 W18 | | $MONTH | YYYY MM | 2026 05 | | $AGENT | owner agent's slug | gtm lead | | $CABINET | current cabinet's id | my startup | | $RUN ID | unique id for this run | r 42a8 | Useful for routing outputs into dated folders that won't collide. Watching a routine run Open the agent's profile (or Routines in the sidebar). Each scheduled run shows up as a row with: The trigger (cron / manual / heartbeat dispatch). The model and effort actually used. A live token counter. The output paths as they get written. You can interrupt a long running routine the same way you'd interrupt a chat — Cabinet writes a clean partial page so nothing is lost. Read on Heartbeats — when a check in is enough. Tasks — for one offs, not schedules. Job schema reference — every YAML field, every default. ## Skills URL: https://runcabinet.com/cabinet/agents/skills/ Skills A skill is a reusable bundle of instructions and helper scripts an agent can pull in for a task. Each skill is a folder with a SKILL.md on top and any assets, scripts, or schemas the agent needs to do the job. Cabinet hosts skills locally, attaches them to personas, and mounts them into the agent's working directory at run time. This page covers what skills can do, where they live, and — most importantly — the security model you're opting into when you install one . What a skill is A folder, e.g.: Cabinet mounts that folder into the agent's run sandbox. The agent reads SKILL.md , decides whether to use the skill, and (if allowed) can run the scripts inside. SKILL.md anatomy | Field | Purpose | | | | | name | Slug used in @ mentions and the skills picker. | | description | Shown in the picker. Write it like a hover card. | | allowed tools | Allow list — only these tools can fire while this skill is active. | | input schema | Optional. Lets you /competitor brief company=acme without freeform parsing. | | output schema | Optional. Hints Cabinet which files this skill writes. | | estimated cost usd | Shown in approvals. Helps your auto approval policy. | Three ways an agent uses a skill 1. Attached to the persona. Listed in the agent's persona.md under skills: . Available on every run. 2. Mentioned in a task. A user types @competitor brief in a task prompt. The skill loads for that one run. 3. Auto discovered. Cabinet looks at the prompt, sees a relevant skill in .agents/skills/ , and offers it. The agent decides whether to use it. Where skills come from Cabinet reads skills from three locations , in order: 1. Cabinet local — .agents/skills/ inside the cabinet you're in. 2. User global — /.cabinet/skills/ across every cabinet on this machine. 3. Bundled — ships with the app for common tasks (research synthesis, code review, doc edits). Local wins on slug collisions. If you don't like a bundled skill, redefine it locally with the same slug. Installing a skill Cabinet downloads the skill, runs a security scan (see below), and asks you to confirm the allowed tools list before activating it. Security model Skills can include scripts. Scripts can do anything a script on your machine can do. Cabinet's defense is in three layers. Layer 1: allow list The allowed tools field in SKILL.md is an allow list , not a deny list. If a tool isn't in the list, the agent can't call it while the skill is active. Empty list = read only skill (no file writes, no scripts, no network). Layer 2: install time scan When you install a skill, Cabinet scans for known dangerous patterns: Shell injection vectors in scripts/ . Network calls to non allow listed domains. Filesystem access outside the cabinet. Symlink shenanigans in the skill folder. The scan output is shown before you confirm the install. force overrides the scan, but you'll see exactly what you're overriding. Layer 3: run time confirmation The first time a skill tries to run a script, Cabinet asks you to confirm — per script, per skill . You can grant "always allow," but it's per script and reversible. Heads up. Skills you write yourself in .agents/skills/ skip the install time scan because there's no install. Treat your own skills with the same care you'd treat your own scripts — they run as you. skills.sh — the registry skills.sh is the public registry of agent skills. Each skill page on the registry shows: The full SKILL.md . The scripts. The security scan result. Usage stats and reviews. A one line install command. You can also publish your own: It opens a PR to the registry repo with your skill folder. Keep SKILL.md tight and the description honest — those are what people see in the picker. Updating skills Updates re run the security scan and re prompt you for any new allowed tools entries. A skill can never silently gain a new permission. Read on Persona — how to attach skills to an agent by default. Skill schema reference — every SKILL.md field. Browse skills.sh ↗ — the public registry. ## Tasks URL: https://runcabinet.com/cabinet/agents/tasks/ Tasks A task is the smallest unit of work in Cabinet. One prompt, one agent, one run, one output. Tasks are the thing routines schedule, agents dispatch, and you create from the kanban board. Where tasks come from Tasks land on the board through three channels: You — click + New Task on the kanban, type a prompt, pick an agent. Routines — every scheduled run shows up as a task with the routine name attached. Other agents — a lead proposes a LAUNCH TASK , you approve it, it lands on the board. The five lanes Cabinet's default board has five lanes that mirror how a real team's work moves: | Lane | Meaning | Who acts next | | | | | | Inbox | Just landed. Not assigned, not started. | You triage. | | Your turn | The agent finished and needs your call (review, approve, decide). | You. | | Running | An agent is actively working it. | The agent. | | Just finished | Output written, not yet acknowledged. | You skim. | | Archive | Done. Kept for history and search. | Nobody. | Drag cards across lanes. Status changes are git tracked so you can see who moved what when. A task card Every card shows: Title — what the task is. Agent — who's running it, with their emoji. Trigger — Manual / Job / Heartbeat / Dispatched by. Status pills — running, waiting on you, blocked, done. Effort — model + reasoning level used for this run. Output links — pages this task wrote. Click a card for the full transcript, the prompt, and the diff of every page it touched. Creating a task The fastest way is the global hotkey ⌘N from anywhere in the app. You get a small composer: Pick an agent, pick a model + effort, choose Add to Inbox (queued for later) or Run now (the agent starts immediately). Filters and views The board has three views : Kanban — the lanes above. Default. List — flat sortable table. Best for triage of a busy day. Schedule — calendar view of upcoming routines + heartbeats. And these filters : By agent — see only what one agent is doing. By trigger — Manual, Job, Heartbeat. By status — Running, Waiting, Done. By cabinet visibility — current folder only, current cabinet, or all. Approvals Tasks proposed by another agent show up with an approval pill instead of a normal status. You approve them inline, swap the model or effort, or reject. See Conversations & approvals. What a task writes Every task writes at least one of: 1. A page — the output, in a folder you (or the agent) chose. 2. A memory entry — for the agent's own future runs. 3. A transcript — kept under .cabinet state/ for audit. If it writes a page, it's durable. If it only writes memory or a transcript, it's invisible to your future self. Default to writing a page when the work matters. Read on Routines — for tasks that need to recur. Showcase: Tasks — the live read only board. Conversations & approvals — the safety surface around dispatched tasks. ## Data URL: https://runcabinet.com/cabinet/data/ Data The Data tab is your file tree . Whatever lives in your cabinet folder shows up here, in the same order, with first class viewers for the formats you already use. What you can put in a cabinet Notes. Plain markdown. Cabinet's editor gives you a slash menu, wiki links, mentions, callouts, math, color, and source mode when you want it. Office files & PDFs. Word, Excel, PowerPoint, Google Workspace exports, and PDFs render inline — no download dance. Data files. CSVs render as tables. Source code renders with syntax highlighting. Mermaid diagrams render as diagrams. Media. Images, video, and audio play in place. Embedded apps (HTML / web bundles) run as live panels. Read more Markdown editor — slash commands, links & mentions, media & embeds, callouts. File types — every format Cabinet knows how to show. Connect Knowledge — local folders, cloud sources (Drive, iCloud, OneDrive, Dropbox), linked content. Tip: drag any folder onto Cabinet to make it a cabinet. Drag any file in to add it. ## Markdown editor URL: https://runcabinet.com/cabinet/data/editor/ Markdown editor Cabinet's editor is Notion grade WYSIWYG on top of plain markdown . Everything you type roundtrips to a file on disk. Open the source toggle in the top right of any page to see the raw markdown anytime. This is the page surface where most of the work happens. Below is what it can do. What lives in this section | Page | What it covers | | | | | Slash commands | Every command grouped into Basic, Media, Advanced. | | Media & embeds | Images, video, embed providers (YouTube, Loom, X, Spotify, …). | | Callouts, math, & color | Tip / warning blocks, KaTeX math, the Cabinet highlight palette. | | Links & mentions | Wiki links, @ mentions, AGENTS.md context files. | Bubble menu — at a glance Select any text, the bubble menu appears. From there: Bold , italic , underline , strike , inline code . Color the selection or highlight it. All six Cabinet highlights are available. Align left / center / right / justify. Wrap as a link. Selections roundtrip through markdown as inline HTML so styling survives a file save and a git diff . Drag handle Hover any block and a ⋮⋮ handle appears in the left margin. Drag it to reorder paragraphs, lists, embeds, or images. Cabinet writes the new ordering back to the markdown file. Source mode Every editor view has a Source toggle in the top right. Click it to see (and edit) the raw markdown that will be written to disk. The two modes share the same selection, so you can drop into source for a tricky section and pop back without losing your place. Auto save Cabinet auto saves 500ms after the last keystroke . There's no Save button, no unsaved changes indicator. If you want to force a save, ⌘S works. Every save is one git commit, so you can ⌘Z through days of work via the page history pane. Keyboard shortcuts (greatest hits) | Shortcut | Action | | | | | / on empty line | Open slash menu | | ⌘B / ⌘I | Bold / Italic | | ⌘K | Search the current room | | ⌘⇧A | Toggle AI panel | | ⌘ | Toggle web terminal | | ⌘S | Force save | | ⌘Z / ⌘⇧Z | Undo / Redo | | ? | Open the searchable cheat sheet | The full list lives behind ? in the app. It's searchable. Read on File types — what else Cabinet renders inline beyond markdown. Tips → CLI Power User — the keyboard flow that compounds. Reference → Supported file types — the full first class types table. ## Callouts, math & color URL: https://runcabinet.com/cabinet/data/editor/callouts-math-and-color/ Callouts, math & color The advanced group of slash commands plus the Cabinet highlight palette. Use them to make pages skimmable. Callouts Type /Callout for an info block or /Warning for an alert. The two callouts on this docs site map to four variants under the hood: tip , info , warning , danger . In the editor, callouts roundtrip through markdown as fenced HTML blocks: Cabinet highlights Cabinet ships with six highlight colors and five inline text colors . They roundtrip through markdown as inline and tags so other tools and git diff can read them. Conventions on this docs site Yellow for the one thing the reader needs to remember per section. Blue for cross references and external pointers. Green for confirmations, shipped behavior, success paths. Red for blockers and breaking changes. Amber for tips and small habits that compound. Purple for schema fields, YAML keys, and code adjacent emphasis. You're free to redefine these per cabinet — they're just CSS. Math Type /Math for inline KaTeX, or wrap raw text in $…$ (inline) or $$…$$ (block). Renders as: The energy mass equivalence is $E = mc^2$. For a block: KaTeX is fast (no MathJax dependency) and the source stays readable as plain text — you can grep your cabinet for mc^2 and find it. Emoji /Emoji opens a picker, or paste any emoji directly: 🚀 ☕ 🔥 🌱 📈 🧭. Emoji is used heavily in agent personas (the 🤖 in persona.md ) and across the AI team UI. Checklists /Checklist creates a task list: x Edit colors and highlights x Paste a YouTube link Try the drag handle on the left gutter Toggle source mode on this page These roundtrip through GFM checklist syntax so they work cleanly in any other markdown editor too. Read on Slash commands — the picker reference. Tips → Best Results — when to use which highlight. ## Links & mentions URL: https://runcabinet.com/cabinet/data/editor/links-and-mentions/ Links & mentions Cabinet has three link surfaces : standard markdown links, wiki links, and @ mentions for AI context. Standard markdown links Type label or paste any URL with text selected. Renders as a link, source stays plain markdown. External URLs open in a new tab; internal ./relative/ and /absolute/ paths stay in app. Wiki links Type and start typing a page title. Cabinet autocompletes by slug. Wiki links resolve at build time (in the docs site) and at render time (in the app). If the target page is renamed, links don't break — Cabinet re resolves by slug. Refactor your titles freely. @ mentions in the AI panel In the AI panel composer (or any agent task prompt) type @ and start typing: | Form | What it attaches | | | | | @PageName | The full page contents as agent context. | | @folder/ | The folder's directory listing plus its index page. | | @chat:slug | A past conversation, by chat slug. | | @agent:slug | Another agent's persona — useful when leads dispatch. | | @skill:slug | A skill, scoped to this run only. | Mentions become attached context tokens — the agent sees the file, but you don't have to copy paste it. AGENTS.md — the auto attached context file Drop an AGENTS.md at any folder root and Cabinet auto attaches it to every agent run that touches that folder. Use it like a working agreement: Cabinet treats AGENTS.md like a per folder system prompt that augments (never replaces) the persona. Page anchors Every heading gets an auto generated anchor, in the Cabinet app and on this docs site alike, so a section link jumps straight to that heading. Page URLs are clean and shareable (for example /room/your room/path/to/page provider routing ), so you can send a teammate to the exact spot. Click any heading on this docs site to copy its deep link. In source: Read on Reference → Manifest schema — where dispatch and approvals policy live. Tips → Context Files & Mentions — the small habits that compound. ## Media & embeds URL: https://runcabinet.com/cabinet/data/editor/media-and-embeds/ Media & embeds Cabinet handles images, videos, and dozens of URL based embeds as first class blocks in the editor . Everything saves next to the page on disk, except embeds — which are stored as iframes in the markdown source. Images Three ways to add an image, all save the file next to the page: 1. Paste a copy pasted screenshot — uploads and inserts automatically. 2. Drag & drop from Finder onto the editor. 3. Click the image icon or type /Image for the Upload or From URL tab. Hover any image and drag the side handles to resize — the width persists across reloads. ↑ Example image inserted via /Image → From URL . Hover it in edit mode to see the resize handles. Video Click the video icon or type /Video to upload a file or paste a direct video URL. In the editor it renders as a player; on disk it's a plain HTML5 <video> tag the markdown source preserves. Embeds — universal Click the embed icon (sparkles) or type /Embed . Cabinet auto detects the provider and writes the right iframe markup. | Provider | Paste a link like… | | | | | YouTube | https://youtube.com/watch?v=… | | Vimeo | https://vimeo.com/… | | Loom | https://loom.com/share/… | | X / Twitter | https://x.com/user/status/… | | TikTok | https://tiktok.com/@user/video/… | | Facebook / Instagram | any public post URL | | Spotify | https://open.spotify.com/track/… | | Anything else | falls back to a generic iframe | Tip. Pasting a recognized URL on an empty line auto embeds without the popover. Files For anything that isn't an image or video, type /File (or drop it into the editor). It saves next to the page and renders as a download chip with the filename and size. The browser handles previews for what it can (PDF, plain text, images); other types open in Finder. Where files live on disk Every uploaded file lands in the same folder as the page that holds it. So a page at: …with a pasted screenshot ends up with: No global media bucket. Move the page folder, the assets move with it. Delete the folder, the assets are gone too. Read on Slash commands — the picker reference. File types — every file type Cabinet renders inline. ## Slash commands URL: https://runcabinet.com/cabinet/data/editor/slash-commands/ Slash commands Press / on an empty line to open the command menu. Type to filter, ↑ / ↓ to navigate, Enter to insert. Every command Three groups, all sharing the same picker. Basic — text and structure | Command | Inserts | Markdown it writes | | | | | | /Text | Plain paragraph | … | | /Heading 1 | H1 | … | | /Heading 2 | H2 | … | | /Heading 3 | H3 | … | | /Bullet list | Unordered list | … | | /Numbered list | Ordered list | 1. … | | /Checklist | Task list | … | | /Code block | Fenced code | yaml commands: name: meeting label: Meeting note insert: | Meeting — $DATE Attendees: Notes Action items name: weekly label: Weekly review insert: | Week of $YYYY WW Wins Blockers Next week Type /meeting on a new line, hit Enter, the template lands. Variables get interpolated , just like in routines. Read on Media & embeds — what each media command does in detail. Callouts, math, & color — the advanced group in detail. Tips — the keyboard flow that compounds. ## File types URL: https://runcabinet.com/cabinet/data/file-types/ File types Cabinet treats specific file formats as first class views . Drop them in your cabinet folder and they render inline — markdown, CSV, PDF, mermaid, images, video, audio, code, office docs, embedded apps, and Google Workspace pages all just work. Click any row in the table for a live or annotated example. Anything not on this list still lives in your cabinet as an asset linked from a markdown page. Why this matters A scattered tool stack means you open a different app to view each file. Cabinet collapses that — your screenshot, your spreadsheet, your podcast clip, your codebase, and your meeting notes all sit in the same sidebar , all browsable, all searchable, all editable in place. The agent that reads your launch plan can also see the screenshot you pasted into it. Patterns A few rules that show up across all the file type viewers: Files render where they live. A pasted screenshot saves into the same folder as the page that holds it. Move the page folder, the assets move with it. The sidebar shows actual file extensions. No hidden conversion. What you see in ls is what you see in Cabinet. Read only is fine — and intentional. Office docs, PDFs, and Google Workspace pages render but don't allow inline edits. Cabinet's editor is for markdown; everything else has a source app. Sub pages Markdown page — the editor surface itself. CSV data — interactive table editor with source view. PDF document — inline browser native viewer. Mermaid diagram — rendered live. Images — paste, drop, URL, resize handles. Video & audio — inline players. Source code — syntax highlighted viewer. Office documents — .docx / .xlsx / .pptx , inline. Embedded apps — folders with index.html . Google Workspace pages — live Sheets / Docs / Slides / Forms. Linked content — symlinks and .repo.yaml git repos. Read on Markdown editor — the editing surface itself. Reference → File structure — what else lives in a cabinet folder. ## CSV data URL: https://runcabinet.com/cabinet/data/file-types/csv/ CSV data Files: .csv . CSV files render as an interactive table editor in Cabinet. Click a cell to edit, press Tab / Enter to navigate, sort by clicking a header. Toggle to source view to see and edit the raw CSV. Sample file in this docs cabinet There's a real CSV in this folder: sample pipeline.csv — 6 rows of a sales pipeline. In Cabinet, opening that file would show: | name | company | stage | owner | next action | score | last touched | | | | | | | | | | Avery Chen | Northwind | demo scheduled | GTM Lead | send agenda | 84 | 2026 05 02 | | Jordan Park | Globex | intro replied | LinkedIn Operator | follow up Tuesday | 67 | 2026 05 01 | | Kai Müller | Initech | negotiation | GTM Lead | respond to redlines | 91 | 2026 05 03 | | Priya Rao | Acme | proposal sent | GTM Lead | nudge by Friday | 76 | 2026 04 29 | | Sam Okafor | Hooli | closed won | Revenue Analyst | kickoff scheduled | 99 | 2026 05 04 | | Thalia Reyes | Soylent | evaluating | Research Lead | send case study | 72 | 2026 04 30 | What the table editor gives you Click to edit any cell. Auto saves to disk. Sort by clicking a column header. Filter with a quick search above the table. Add rows or columns at the end. Source toggle to switch between table and raw CSV. Why it matters Most KB tools force CSVs to live somewhere else (Drive, Sheets, an attachment). Cabinet lets your data sit next to your notes . That's a big deal for agents — a Pipeline Tracker agent can read this file directly, write a one line note to changelog.md when a row's status changes, and the whole loop stays in the same folder. Tip. CSV agents work better when columns have stable names. Rename a column once, update memory, and the agent keeps up — but mid flight column renames cause silent breaks. Limits Cabinet's CSV editor is not a spreadsheet . No formulas, no charts, no pivot tables. For that, drop in an .xlsx (rendered read only) or use a Google Workspace page. Very large CSVs ( 50,000 rows) lazy load. The whole file isn't in memory at once. Read on Office documents — .xlsx for formulas and charts. Google Workspace pages — live, collaborative sheets. ## Embedded apps URL: https://runcabinet.com/cabinet/data/file-types/embedded-apps/ 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. 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: 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: | Pattern | Example | | | | | Read only dashboard | Pipeline dashboard reading ../data/pipeline.csv via fetch | | Custom widget | A budget calculator with sliders that writes back to ../config.json | | Mini game / sandbox | A quick prototype to share with the team | | Demo for a client | Self contained, no auth, just a folder you ship | | Embedded data viz | D3 / Chart.js / Plotly reading from cabinet files | Reading other cabinet files from the iframe Embedded apps can read sibling files via relative fetch : 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 Linked content — for git repos and symlinks. Google Workspace pages — for live collaborative apps you don't host yourself. ## Google Workspace pages URL: https://runcabinet.com/cabinet/data/file-types/google-workspace/ Google Workspace pages A markdown page with a google: key in its frontmatter becomes a live iframe of a Google Sheet, Slide deck, Doc, or Form right inside Cabinet. Open the page — instead of the markdown body, Cabinet renders the embedded sheet. Click Open in Google in the toolbar to jump to the source for editing. What it supports | kind | Surface | | | | | sheet | Live Google Sheet — view, navigate, sometimes edit (depends on the sheet's sharing) | | doc | Live Google Doc | | slide | Live Slides deck — present mode supported | | form | Live Form (collect responses) | Why it works Cabinet doesn't host inference and Cabinet doesn't host collaborative editing. Google does both well. The Google Workspace integration lets you keep live, collaborative, formula rich documents as nodes in your cabinet tree — searchable in the sidebar, linked from your markdown notes, attached to agent tasks — without trying to reimplement Sheets or Docs. Patterns Tip. Use a Google Sheet for anything where formulas, charts, or pivot tables matter. Use a .csv for everything else — CSVs sit in your cabinet, syncs are simpler, agents can edit them directly. | Use a Google Sheet for | Use a CSV for | | | | | Formulas, pivots, charts | Agent edited row data (CRM, leads, content calendars) | | Live collaboration with non Cabinet users | Anything you want git tracked | | Sheets you already have | New data tables | What agents see By default, agents see only the metadata (title, URL, kind). To let an agent read the contents: 1. Install the Google Workspace MCP server — it gives agents a gws.read sheet / gws.read doc tool. 2. Authenticate the agent's persona with a service account or OAuth flow. 3. The agent can now read sheet({url: ...}) as part of a task. Heads up. Granting an agent Google Workspace access is a real permission expansion. Treat it like granting any external API access — start tight, expand as needed. Read on CSV data — for editable tables that live in your cabinet. Office documents — for .xlsx files (read only, no live collab). Integrations — the Google Workspace MCP server. ## Images URL: https://runcabinet.com/cabinet/data/file-types/images/ Images Files: .png .jpg .jpeg .gif .webp .svg .avif .ico . Images render with the native browser viewer . Drop an image anywhere in your cabinet folder and it appears in the sidebar with a pink image icon. Live example This folder contains a sample PNG: cabinet icon.png . Embedded inline in this page: And the JPG version: cabinet icon.jpg . Three ways to add images In the editor, three paths all save the file next to the page: 1. Paste a copy pasted screenshot from the clipboard — uploads and inserts automatically. 2. Drag & drop from Finder onto the editor. 3. Click the image icon or type /Image for the Upload or From URL tab. Hover any image in the editor and drag the side handles to resize. The width persists as inline HTML on the markdown page. Where they land on disk Images live in the same folder as the page that holds them: No global media bucket. Move the page folder, the assets move with it. What agents see Agents on a vision capable model (Claude Sonnet+, GPT 4o+, Gemini 2.5+) can read images you @ mention in a task prompt. Useful for screenshots ("annotate this onboarding flow") and for visual QA ("does this match our brand?"). SVGs are first class .svg files render inline with full vector quality and stay editable as text. An agent can edit an SVG by editing its source. That's a quiet superpower for diagrams that need fine tuning. Read on Markdown editor → Media & embeds — paste, drop, URL. Video & audio — for moving pictures and sound. ## Linked content URL: https://runcabinet.com/cabinet/data/file-types/linked-content/ Linked content Cabinet can point at folders that live elsewhere on disk without copying anything. Two flavors: Linked directory — a plain symlink. Behaves like any folder in your cabinet. Linked git repo — a folder with a .repo.yaml . Behaves the same, plus agents get repo context. How to link a folder Right click any item in the sidebar → Load Knowledge → pick a folder on your machine → optionally name it → Load . Cabinet creates a symlink inside the cabinet, so a folder at /Users/you/Development/my repo/ shows up as ./my repo/ in the sidebar tree. Edits stay in the original location. For details and the .cabinet meta schema see Guides → Connect Knowledge. .cabinet meta Add metadata about the linked folder: Cabinet picks it up on next scan. Title shows in the sidebar; description shows on hover. .repo.yaml — turn a folder into a Linked Git Repo If the linked folder is a git repo, drop a .repo.yaml at the root: The folder still acts like a normal cabinet folder — pages render, files are editable, agents can write into it. The difference: agents become aware of git context : The current branch and commit. Recent commit messages and authors. A diff for any range the agent asks about. Which files have uncommitted changes. That makes a Code Reviewer agent qualitatively better — it can see what changed this week, not just what's there now. Why linking matters Most KB tools force you to import or copy. Cabinet works where your data already lives : Your code repo appears as a folder inside your cabinet — agents can read it without checkout. A Notes folder synced via iCloud/Dropbox can be navigated and searched from Cabinet. A multi cabinet setup can share a common folder by symlinking it into both. Where linked folders show up in the sidebar Linked directories get a link icon . Linked git repos get an orange branch icon . Both expand and behave like normal folders — your fingers can't tell the difference. CABINET DATA DIR Cabinet looks for top level cabinets at $CABINET DATA DIR (default /cabinets/ ). Set the env var to point at a different location: Useful if you keep cabinets on an encrypted volume or a synced folder. Agents respect the path; symlinks under it work normally. Read on Guides → Connect Knowledge — the right click flow in detail. Guides → Apps & repos — embedded apps and repos paired together. ## Markdown page URL: https://runcabinet.com/cabinet/data/file-types/markdown/ Markdown page Files: .md , plus any folder with an index.md at the root. The most common file type in a cabinet. Renders in the WYSIWYG editor with a source toggle so you can see and edit the raw markdown anytime. This page itself is a file types/markdown/index.md file. You're looking at the rendered version. What makes a markdown page first class The editor parses and writes GFM markdown (tables, task lists, fenced code, autolinks). Extended HTML inside the markdown roundtrips cleanly — highlights, colors, callouts, embeds. A page can have YAML frontmatter for metadata Cabinet reads (title, tags, modified date, custom fields). A page becomes a sidebar node when it sits in a folder with the right structure. Frontmatter | Field | Used for | | | | | title | Sidebar label, page header, OG title. | | tags | Filter the sidebar, search facet, agent context. | | created / modified | Sort, recency surfaces, "last updated" hints. | | order | Override alphabetical sort within a folder. | | status | draft badge in the UI. | | google | If set, the page becomes a Google Workspace page. | | Anything else | Stored verbatim. Available to agents as context. | index.md and folder pages A folder becomes a navigable page when it contains an index.md : The folder's index.md shows when you click the folder. Other markdown files in the folder appear as siblings in the sidebar tree. What you can put in the body Everything the editor supports: Headings, lists, checklists, tables, blockquotes, code fences. Inline formatting and Cabinet highlights. Wiki links and @ mentions for AI context. Math, callouts, embeds, images. Plain HTML for anything markdown can't express. Read on Markdown editor — the editing surface in detail. File types — the rest of the inventory. ## Mermaid diagram URL: https://runcabinet.com/cabinet/data/file-types/mermaid/ Mermaid diagram Files: .mermaid , .mmd . Cabinet renders Mermaid files as diagrams. Open a .mermaid file in the sidebar — it shows the rendered diagram with a source toggle to switch between the picture and the text. Live example The diagram below is rendered from agent loop.mermaid — a real file in this docs cabinet, rendered live at page load with the same mermaid.js Cabinet uses. Why diagram as text matters Source controlled. A .mermaid file is a few lines of plain text. git diff shows what changed. Agent friendly. An agent can write a Mermaid diagram by writing text. No GUI required. Re themeable. The same source renders in light or dark mode automatically. Common diagram types Mermaid supports a lot of shapes: | Type | Use | | | | | flowchart | System diagrams, agent loops, decision flows. | | sequenceDiagram | API calls, hand offs between agents. | | gantt | Project timelines. | | stateDiagram v2 | State machines, lifecycle diagrams. | | classDiagram | Schemas, type relationships. | | gitGraph | Branch and merge stories. | | mindmap | Brainstorms, hierarchies. | Inline mermaid in markdown You can also drop mermaid into a markdown page with a fenced block: mermaid flowchart LR A You B GTM Lead B C Approval queue C D Research Lead Cabinet renders it inline. Same look as a standalone .mermaid file. Read on Source code — for any other text based file format. Markdown editor — for embedding mermaid blocks in pages. ## Office documents URL: https://runcabinet.com/cabinet/data/file-types/office-documents/ Office documents Files: .docx , .xlsx , .xlsm , .pptx . Office files render inline, read only in Cabinet. Drop a .docx , .xlsx , or .pptx anywhere in your cabinet folder and it appears in the sidebar — click it to view in place. Download and Reveal in Finder buttons let you open in the source app for editing. Word documents ( .docx ) Renders via docx preview . You see formatted text, headings, lists, tables, inline images. | Surface | Behavior | | | | | Sidebar icon | Blue document | | Inline viewer | Full text + basic formatting | | Editing | Read only — edit in Word / Pages, save, Cabinet picks up the new version | | Agent context | @file:meeting notes.docx extracts text and feeds the agent | Spreadsheets ( .xlsx , .xlsm ) Renders via SheetJS . You get a multi sheet grid with tabs to switch sheets, plus the values of formulas (not the formulas themselves). | Surface | Behavior | | | | | Sidebar icon | Green spreadsheet | | Inline viewer | Tabbed sheets, scrollable grid | | Editing | Read only. Use .csv for editable tables, or Google Workspace pages for live sheets. | | Formulas | Computed values shown; formulas not preserved on save | Presentations ( .pptx ) Renders via pptx preview . You get a slide by slide view with speaker notes, navigable by arrows or thumbnail strip. | Surface | Behavior | | | | | Sidebar icon | Orange presentation | | Inline viewer | Slide by slide with thumbnails | | Editing | Read only — edit in Keynote / PowerPoint | | Agent context | Extracts slide text + speaker notes | When to use what Tip. If you're authoring something new in Cabinet, use markdown. If you're inheriting docs from elsewhere (a contract, a board deck, a partner's workbook), drop the office file in as is — Cabinet renders it without conversion. | If you want to… | Use | | | | | Edit text alongside notes | A markdown page | | Run formulas, build charts | An .xlsx (read in Cabinet, edit in Excel/Numbers) or a Google Workspace Sheet | | Show a board deck inline | A .pptx | | Share legal docs | A .docx or .pdf | Why read only is the right default Cabinet's editor is for markdown. Word docs have tracked changes , sheets have complex formulas , decks have precise layouts — those workflows belong in the source app. Cabinet's role is to make them visible in the same sidebar where everything else lives, so you don't have to bounce between apps to know what's in your folder. Read on CSV data — for editable tables. Google Workspace pages — for live, collaborative office docs. PDF document — for any final form document. ## PDF document URL: https://runcabinet.com/cabinet/data/file-types/pdf/ PDF document Files: .pdf . PDFs render with the browser native viewer — pagination, zoom, search, print, and download all work without a third party library. Drop a PDF into your cabinet folder and it appears in the sidebar with a red PDF icon. What you get Inline pagination in the main panel — no full screen takeover. Browser search across the document with ⌘F . Download and Reveal in Finder buttons in the toolbar. Sidebar navigation stays visible — you can browse other pages without closing the PDF. Drop a PDF anywhere Both PDFs become navigable nodes. Your notes file can link to either of them. What agents see By default, agents see the filename and metadata but not the PDF text. To let an agent read a PDF, attach it explicitly with @file:competitors/acme pricing.pdf in a task prompt — Cabinet runs the PDF through a text extractor before sending the content to the model. Limits The viewer is read only . Cabinet doesn't edit PDFs in place. For very large PDFs ( 200 pages), open them in your default PDF app via Reveal in Finder for better performance. Annotation isn't supported. Use a real PDF tool, save back to the same path, Cabinet picks up the new version. Read on Markdown editor — for the kind of editing PDFs aren't for. File types — the rest of the inventory. ## Source code URL: https://runcabinet.com/cabinet/data/file-types/source-code/ Source code Files: .js .ts .tsx .jsx .json .css .html .py .go .rs .swift .kt .java .rb .php .sh .yaml .yml .toml .sql .md .mjs (and more). Source files render with a syntax highlighted viewer . Cabinet picks the right language by file extension and themes it to match light or dark mode. Toggle the source view to see the file as plain text. Live example This folder has a real file: example persona.yaml . Inline: That's the same shape an agent's persona.md uses — Cabinet's own configuration is just YAML files. More languages Why this matters in a knowledge base A cabinet often sits next to a code repo (or contains a linked git repo). Being able to see and search the code alongside the notes that explain it means: An agent that documents your codebase can read both at once. A meeting note can link to and the link works. A project handoff page can reference real files in the same tree. What agents see Agents see source files as plain text — same as any other file. @ mention a file in a task and the agent gets its full contents (subject to context limits and visibility scope). For repository level reasoning, use a linked git repo — the agent gets commit history and branch context as well. Read on Linked content — .repo.yaml and symlinks. Markdown editor — code blocks inline in pages. ## Video & audio URL: https://runcabinet.com/cabinet/data/file-types/video-and-audio/ Video & audio Video files: .mp4 .webm .mov .m4v . Audio files: .mp3 .wav .ogg .m4a .aac . Both render with native browser players . Drop them in your cabinet, they appear in the sidebar with a cyan video icon (or amber music icon for audio). Live video example A sample WebM is in this folder: cabinet demo.webm . Embedded inline: Your browser doesn't support inline video. Download instead. The same clip you see on the cabinet website hero — Cabinet renders any video file the same way. Inserting in the editor | Path | What it does | | | | | Type /Video → Upload | Pick a file from disk, copies into the page folder. | | Type /Video → From URL | Paste any direct video URL. | | Drag & drop a video file from Finder | Same as Upload. | Audio works the same — /File picks up .mp3 and .wav and renders the audio player. Why this matters A cabinet that can hold a screen recording next to the page that explains it is a different beast from one that holds a Loom URL pointing at a third party CDN. Demos for product features live next to the docs. Voice notes can be dropped into a meeting page and transcribed by an agent. Podcast clips can sit beside the show notes that reference them. Tip. For long recordings ( 200MB), .gitignore the file and link to the original. Cabinet still plays it inline; git won't get bloated. What agents see Agents on transcription capable providers can read audio you @ mention. Pair with a Whisper on disk skill for offline transcription: Read on Images — for stills and screenshots. Markdown editor → Media & embeds — for embed providers (YouTube, Loom, X, etc.). ## Rooms URL: https://runcabinet.com/cabinet/rooms/ Rooms Think of Cabinet as your home . In your home you have several rooms : one for the office, one for your studies, one for a side project, one that's personal. You walk into a room and everything in it belongs to that part of your life. You don't keep tax files in the kitchen. A room is a top level cabinet with its own pages, its own AI team, its own tasks, its own search, and its own look. Switch rooms and the whole workspace changes with you. Switching rooms The home button sits next to the cabinet logo and shows the current room's icon. Click it to: Switch to another room. Customize a room: name, icon, accent color, theme. Add a new room. Open a room in its own window. Delete a room (it moves to trash, so it stays recoverable). You are always inside a room, and Cabinet reopens where you left off, down to the exact page. Each room is its own world Rooms keep your contexts apart by default. Work never bleeds into Personal: Agents and tasks are scoped to the room. Search ( ⌘K ) covers the current room. To look wider, turn on Search other rooms , and results show which room each match came from. Theme follows the room, so you can tell at a glance which one you're in. This is about focus, not a security sandbox: it keeps the right things in front of you and the rest out of the way. To share across rooms, you opt in explicitly. Rooms vs. sub cabinets Inside a room you can still nest cabinets . A "Marketing" cabinet might hold "Launch" and "Ads", each with its own agents. Those are sub cabinets : departments within the same room, and they roll up to it. Rooms are the top level : separate spaces that never roll up into each other. Use sub cabinets to organize one area of work. Use rooms to separate different areas entirely. Clean, shareable URLs Every room and page has a clean URL that mirrors the file tree: Paste one to a teammate and it opens exactly there, including a section jump to a heading. Older links keep working. Read on What is a Cabinet? (the three tabs inside every room) Data (your file tree) Agents (your per room AI team) ## Tasks URL: https://runcabinet.com/cabinet/tasks/ Tasks The Tasks tab is what the team does . Real teams have rhythms — a Monday standup, a Friday update, an inbox check at 9am. Cabinet has the same three rhythms. The three rhythms Tasks — one thing, runs once. "Draft the launch post." You write a brief, dispatch it, the agent works, the output lands in your folder. Routines — a task on a schedule. "Draft the launch post every Friday at 10am." Same shape as a task, plus a cron like schedule. Heartbeats — a recurring check in the agent uses to decide what to do next. "Every weekday at 9am, look at the launch room and tell me what changed." The difference between an assistant you have to summon and a teammate who shows up. What lands back Outputs are durable pages, not chat transcripts . A research task produces a research page. A weekly summary produces a weekly summary page. You'll be able to find it next year by ls ing. Every dispatched piece of work also queues a one click human approval before anything runs that touches the outside world. Read more Tasks — anatomy of a task, brief format, dispatch loop. Routines — schedules, triggers, history. Heartbeats — the rhythm that turns assistants into teammates. Conversations & approvals — how nothing runs without your say so. Tasks vs Routines — when to pick which. ## Concepts URL: https://runcabinet.com/concepts/ Concepts Six pages that explain the product model and the values behind Cabinet. If you've read Philosophy and want the next layer down — start here. The model What is Cabinet App — the in app feature surface in plain language. Cabinet File Format — what's actually on disk: manifest, agents, jobs, pages. AI Team Concept — how personas, skills, and rhythms come together. The values & architecture Principles — the six rules that shape every decision: Yours, Git everything, BYOAI, KISS, Security, Self hosted. Cabinet vs the alternatives — how it compares to Obsidian, Notion, and chat apps. AI Runtime — provider adapters, conversation transcripts, per run overrides. ## AI Runtime URL: https://runcabinet.com/concepts/ai-runtime/ AI Runtime How an agent's call actually reaches a model — and what's between you and the inference. The adapter layer Every AI call in Cabinet — a task, a routine, a heartbeat, a chat message — flows through a provider adapter . The adapter knows how to talk to one specific provider. Cabinet itself doesn't know which model it's calling, just that it asked an adapter to run a prompt and got a transcript back. This split matters because it means Cabinet can support new providers without changing how agents are written . A new adapter ships, the existing personas just gain a new option in their model: field. What ships today Two adapters are in default builds: claude local — talks to the Claude Code CLI on your machine. codex local — talks to the Codex CLI on your machine. Both are local CLI providers — you authenticate the CLI once with your own account, and Cabinet uses it as a subprocess. Your prompts don't go through a Cabinet hosted backend. There's no Cabinet API key. See Bring your own AI for the full provider list and what's coming next. Conversations and transcripts Every adapter run is persisted as a conversation — a stream of messages with timestamps, tool calls, and outputs. While a run is in progress, you watch the transcript live in the Approval Queue or in the agent's workspace. After it finishes, the conversation lands in the cabinet folder so you can scroll, search, or git log it. This is the difference between "the agent ran" and "the agent did this, you can read every step" . Per run overrides A persona declares a default model. A routine, a task, or even a single dispatch can override it. You can also pick model and reasoning effort right at the composer when you launch a one off task: The terminal still exists Cabinet ships with a web terminal — an interactive local AI CLI inside the browser. It's not the only way agents run anymore (the adapter layer is), but it stays as a first class surface for: Direct CLI sessions when you want to drive the agent yourself. Debugging adapter behavior. Future terminal native features (Cabinet managed tmux style workspaces). You can ignore it if you're working entirely through the agent dispatch UI. Read on Bring your own AI — the supported provider list. Conversations & approvals — what happens before a run actually fires. Tasks — the dispatch surface that creates these runs. Persona — where you set an agent's default model. ## AI Team Concept URL: https://runcabinet.com/concepts/ai-team/ AI Team Concept Cabinet treats AI helpers as a team that works inside your knowledge base. An agent can have: A persona. A goal. Skills. Scheduled jobs. Memory files. A workspace for outputs. The goal is not to hide work inside a chat transcript. The goal is to let useful work become durable pages, tasks, research, and decisions in your cabinet. ## Cabinet File Format URL: https://runcabinet.com/concepts/cabinet-file-format/ Cabinet File Format A cabinet is a folder with a small manifest and regular files. The .cabinet manifest names the cabinet and tells Cabinet whether the folder is a root cabinet or a child cabinet. Everything important remains inspectable on disk. ## Cabinet vs the alternatives URL: https://runcabinet.com/concepts/comparison/ Cabinet vs the alternatives Cabinet sits in a space that doesn't have an obvious incumbent. It's not just a notes app , not just an AI assistant, not just a file manager. It's the combination — and the combination is what's new. At a glance | Feature | Cabinet | Obsidian | Notion | | | : : | : : | : : | | AI agent orchestration | Yes | No | No | | Scheduled cron jobs | Yes | No | No | | Embedded HTML apps | Yes | No | No | | Web terminal | Yes | No | No | | Self hosted, files on disk | Yes | Yes | No | | No database / no lock in | Yes | Yes | No | | Git backed version history | Yes | Via plugin | No | | WYSIWYG + Markdown | Yes | Yes | Yes | What this table is really saying vs. Obsidian. Obsidian is great for personal knowledge. Cabinet keeps that — files on disk, plain markdown, plugins style extensibility — and adds an AI team that lives in the same folder . The agents read your notes, write back into them, and run jobs on a schedule. Obsidian doesn't try to be a workflow tool; Cabinet does. vs. Notion. Notion is great for collaborative docs and databases. But your data lives in their cloud, in their format. Cabinet inverts that: your folder, your files, your AI . The trade off is real — you give up Notion's polished collab and embedded views, you get full ownership and a teammate that runs on your machine. vs. ChatGPT / Claude.app. Chat apps are great for ad hoc questions. They're terrible at long running work — every session forgets, nothing persists, outputs get lost in transcripts. Cabinet's bet is that durable pages beat chat history . A research task doesn't end in a chat thread; it ends as research/competitor brief 2026 05.md in your folder. When Cabinet is the wrong choice Cabinet won't replace: Real time collaboration tools like Figma or Google Docs. Cabinet is single user first. Multi user comes later. Tools with strong UI primitives — Notion databases with views, Linear's issue tracker, Airtable's relational tables. Cabinet is markdown + folders. Mobile first workflows . Cabinet is desktop first today (macOS native + browser). Mobile is on the roadmap. What you can do that no one else lets you Write a persona.md and have an agent show up — same model, same prompt structure, every time. Drop an index.html in any folder and Cabinet renders it as an embedded app. AI generated dashboards, version controlled. Schedule a cron job that runs Friday 5pm: read this week's notes, write a summary, commit it. git log your entire knowledge base and see exactly when each idea showed up. Read on What is Cabinet App — the in app feature surface. Cabinet File Format — what's actually on disk. Principles — the values driving the design. ## Principles URL: https://runcabinet.com/concepts/principles/ Principles Cabinet is built around a few principles we think matter deeply for the future of AI + data tools. Every product decision gets weighed against these. Yours Your data stays yours: local, visible, and portable . It's not trapped inside a particular AI provider's system with no clean way to get it out. Plain markdown files on your disk. ls and you see your work. Move the folder, the cabinet moves with it. Git everything Memory should have history. You should be able to inspect changes, revert mistakes, audit how knowledge evolves , and treat your AI system like the important infrastructure it is. Every save auto commits. Full diff viewer. Restore any page to any point in time. BYOAI Bring your own AI. Cabinet should work with Claude, Codex, OpenCode, local models, and whatever comes next , without forcing your knowledge into a single provider's ecosystem. See Bring your own AI for the supported list. KISS Keep it simple, stupid. AI tools should be understandable, inspectable, and hackable . We prefer plain files, clear behavior, and systems that developers can actually reason about. If a feature can't be explained in a paragraph, it usually shouldn't ship. Security We care deeply about security. If AI is going to work with your documents, research, plans, and internal context, the system should minimize surprise, reduce unnecessary exposure, and make trust a design requirement — not an afterthought. Every dispatched piece of work runs through a human approval queue before it touches the outside world. Self hosted If AI is going to hold your context, plans, research, and operating memory, it should run in an environment you control . Cabinet is open source. Self hosted by default. Your data never leaves your machine unless you point an agent at a cloud model — and even then, only the prompts and outputs of that one call. How these compose These six aren't independent — they reinforce each other: Yours + Git everything = your knowledge is auditable forever. BYOAI + Self hosted = no vendor lock in, no hostage data. KISS + Security = a system you can trust because you can read it. If a feature would break any of these, it doesn't make it in. Read on Philosophy — the 90 second pitch. Cabinet vs the alternatives — how these principles play out vs Obsidian and Notion. Bring your own AI — BYOAI in practice. ## What is Cabinet App URL: https://runcabinet.com/concepts/what-is-cabinet-app/ What is Cabinet App Cabinet is a local first knowledge base with AI work built into the workspace. It gives you: A file tree for your knowledge base. Switchable rooms (workspaces) that keep separate areas of work isolated. A rich markdown editor. Search across your pages, scoped to the current room. AI agents with personas and memory. Tasks and routines that can write back into the cabinet. Git backed history for changes. The public website mirrors the Cabinet browsing experience, but it is read only and static. ## Getting Started URL: https://runcabinet.com/getting-started/ Getting Started with Cabinet Cabinet is an AI first knowledge base. Everything lives as files on disk — no database, no cloud lock in. You write pages in markdown, organize them in a tree, and let AI agents help you edit and maintain the whole thing. Already installed? This page is the in app onboarding tour, mirrored for the web. If you're brand new, start with Install Cabinet first. Editor — Notion grade writing The WYSIWYG editor runs on Tiptap . Everything you type roundtrips to plain markdown on disk. Headings, lists, and styling Select any text and the bubble menu appears. Use it for bold , italic , underline , strike , code , super script , sub script , alignment, and links. Text color and highlights Pick text color or background highlight from the toolbar or bubble menu. They roundtrip through markdown as inline HTML. Red urgency notes for incidents Green confirmations for shipped items Yellow highlights for key terms Blue backgrounds for cross references Images — paste, drop, or URL Three ways to add an image, all save the file next to this page on disk: 1. Paste a copy pasted screenshot — it uploads and inserts automatically 2. Drag & drop a file from Finder onto the editor 3. Click the image icon on the toolbar, or type /Image , and use the Upload tab or From URL tab Hover any image and drag its side handles to resize — the width persists across reloads. Videos and universal embeds Click the video icon or type /Video to upload a file or paste a direct video URL. Click the embed icon (sparkles) or type /Embed for YouTube, X, Vimeo, Loom, TikTok, Spotify, Facebook, Instagram, or any URL — Cabinet auto detects the provider. Supported providers when you type /Embed : | Provider | Paste a link like… | | | | | YouTube | https://youtube.com/watch?v=… | | Vimeo | https://vimeo.com/… | | Loom | https://loom.com/share/… | | X / Twitter | https://x.com/user/status/… | | TikTok | https://tiktok.com/@user/video/… | | Facebook / Instagram | any public post URL | | Spotify | https://open.spotify.com/track/… | | Anything else | Falls back to a generic iframe | Pasting a recognized URL on an empty line auto embeds without the popover. Slash commands Press / on an empty line to open the command menu, grouped into Basic , Media , and Advanced . | Group | Commands | | | | | Basic | Text, H1/H2/H3, Bullet, Numbered, Checklist, Code block, Quote, Divider, Table | | Media | Image, Video, Embed, File | | Advanced | Callout, Warning, Math, Emoji | Callouts Use /Callout for info blocks and /Warning for alerts: Tip. You can drop a file onto an already open page and it saves straight into the page's directory — no need to move it manually. Heads up. Don't edit files inside .git , .history , or .jobs — Cabinet owns those. Math, emoji, checklists Type /Math or wrap in $…$ / $$…$$ — KaTeX renders inline, e.g., $E = mc^2$ Type /Emoji for a picker, or paste unicode directly 🚀 Type /Checklist for a task list Drag handle Hover any block and a ⋮⋮ handle appears in the left margin. Drag it to reorder paragraphs, lists, embeds, or images. Wiki links and mentions Type Page Name to link another page (autocompletes the slug). In the right side AI panel use @PageName to attach pages as context for the agent. Source mode Every editor view has a Source toggle in the top right. Click it to see (and edit) the raw markdown that will be written to disk. Core features WYSIWYG Editor — rich text with Notion grade features. Auto saves 500ms after each keystroke. Example: Select a phrase → pick yellow highlight → keep typing. On disk it's saved as phrase . AI Editor Panel — right side chat for editing the current page. @mention other pages to pass their content as context. Example: Open a draft, press ⌘⇧A , type "Tighten the intro using @Brand Voice as reference." The agent edits this page inline. Agent Dashboard — detached AI runs with live transcripts. Each conversation becomes a row under Agents. Example: Ask an agent to research competitors overnight. Run shows running → completed with full output accessible next morning. Scheduled Jobs — YAML configs in /data/.jobs/ fired by cron. Example: monday digest.yaml runs every Monday 09:00, asks Claude to summarize last week's commits, writes the result to /data/weekly/ . Heartbeats — recurring agent check ins defined in persona.md . Lightweight "ping the state" runs. Example: A support heartbeat every 4h scans /data/inbox/ for new tickets and tags urgency. Kanban Tasks — visit /tasks . Cards live in board.yaml . Example: Drag a card from Backlog to In Progress → Cabinet kicks off the linked agent run automatically. Agent to Agent Dispatch — any agent with the Can dispatch toggle on can propose tasks, scheduled runs, and recurring jobs for teammates. Every proposal is queued for one click human approval. See Delegating Between Agents. Web Terminal — ⌘ toggles an interactive terminal. Good for focused CLI work. Search — ⌘K , full text across the current room, ranked by relevance. (Opt in to search other rooms.) Version History — click the clock icon on any page to see git commits, diff them, or one click restore. Drag & Drop — reorder pages in the sidebar, drop files onto the editor to upload. Rooms & sub cabinets — top level cabinets are rooms you switch between (each its own isolated workspace); nested sub cabinets inside a room get their own agents, jobs, and visibility and roll up to it. Office documents — drop .docx , .xlsx , or .pptx anywhere and they render inline. Read only, with Download and Reveal in Finder buttons. Google Workspace pages — a markdown page with a google: frontmatter key becomes a live iframe of a Google Sheet, Slide deck, Doc, or Form. Keyboard shortcuts | Shortcut | Action | | | | | ⌘K | Open search | | ⌘S | Force save | | ⌘ | Toggle terminal | | ⌘⇧A | Toggle AI panel | Sub pages Apps and Repos — embedded apps, full screen mode, and linked repos Symlinks and Load Knowledge — direct symlinks, .cabinet meta , .repo.yaml , and CABINET DATA DIR Delegating Between Agents — agent to agent dispatch, LAUNCH TASK / SCHEDULE proposals, approval panel, per row model/effort overrides Skills — installable agent skills, attaching to personas, and the security model Supported file types Cabinet treats specific file formats as first class views. Everything else can still live in the KB as an asset linked from a markdown page. | Type | Files | How Cabinet shows it | | | | | | Markdown page | .md , index.md | WYSIWYG editor with markdown source toggle | | CSV data | .csv | Interactive table editor with source view | | PDF document | .pdf | Inline PDF viewer (browser native) | | Mermaid diagram | .mermaid , .mmd | Rendered diagram | | Image | .png .jpg .jpeg .gif .webp .svg .avif .ico | Inline image viewer | | Video | .mp4 .webm .mov .m4v | Inline video player | | Audio | .mp3 .wav .ogg .m4a .aac | Inline audio player | | Source code | .js .ts .py .go .swift .yaml .json (and more) | Syntax highlighted viewer | | Embedded website | Directory with index.html , no index.md | Iframe in main panel, sidebar visible | | Full screen app | Directory with index.html + .app marker | Full screen iframe, sidebar collapses | | Directory | Any folder with index.md | Expandable tree node in the sidebar | | Linked Git repo | Directory with .repo.yaml | Normal page/folder, repo context for agents | | Linked directory | Symlink without .repo.yaml | Normal folder, contents appear as children | | Word document | .docx | Inline read only render (docx preview) | | Spreadsheet | .xlsx , .xlsm | Multi sheet grid with tabs (SheetJS) | | Presentation | .pptx | Slide by slide view (pptx preview) | | Google Workspace page | .md with google: frontmatter | Iframe to Sheets / Slides / Docs / Forms | | Legacy office / archive | .doc .ppt .xls .odt .rtf .zip .fig .sketch | Shown in sidebar, opens in Finder | For more detail, see File types. ## Apps and Repos URL: https://runcabinet.com/getting-started/apps-and-repos/ Apps and Repos Cabinet goes beyond markdown pages. You can embed full web applications , link external Git repositories, and create interactive tools that live right alongside your documentation. Embedded apps Any directory that contains an index.html file and no index.md is treated as an embedded app. Cabinet renders it in an iframe. Standard embedded app The app renders in the main content area with the sidebar and AI panel still visible. Good for dashboards and reference tools you want to glance at while working. Full screen app ( .app marker) Add an empty .app marker file to the directory and the app gets maximum space: the sidebar and AI panel auto collapse on open . A Back to KB button in the toolbar restores the normal layout. Both types appear in the sidebar automatically — no build step, no deployment . Linked repositories A .repo.yaml file in any data directory links it to a Git repository. Agents use this to read and search source code in context when working on related documentation. Fields | Field | Required | Description | | | | | | name | Yes | Human readable project name | | local | Yes | Absolute path to local clone | | remote | No | GitHub URL — used for links, issues, PR suggestions | | source | No | local , remote , or both (default: both ) | | branch | No | Default branch (default: main ) | | description | No | Free text description for agent context | When an agent works on a KB page that has a .repo.yaml in the same directory or any parent, it will: 1. Read the .repo.yaml to find the linked repo 2. Use the local path to read source code and understand architecture 3. Use the remote URL when creating links or suggesting PRs The sidebar shows these directories with an orange GitBranch icon . Back to Getting Started. ## Delegating Between Agents URL: https://runcabinet.com/getting-started/delegating-between-agents/ Delegating Between Agents A Cabinet agent isn't just a solo operator — it can propose work for teammates . When the CEO plans a launch, it can dispatch research to the analyst, draft copy to the editor, and schedule a weekly digest for growth, all in one turn. Every proposal is queued for one click human approval before anything spawns , so you stay in control of the tree of work. Turning dispatch on Open any agent (click it in the sidebar or visit /agents/ ). Next to the Active toggle in the header, flip the Can dispatch pill on. Can dispatch (filled) — the agent may propose LAUNCH TASK , SCHEDULE JOB , and SCHEDULE TASK actions. No dispatch (dashed) — any dispatch the agent emits is flagged with a persona cannot dispatch warning and blocked. Leads default to on; everyone else is opt in. Flip it for the specific agents you want to act as orchestrators (typical: a CEO, a PM, a project lead). How an agent proposes work Under the hood, agents wrap proposals in a fenced cabinet block at the end of their reply. Cabinet parses these without the agent needing any special tool plumbing. Two forms are supported: Inline — one action per line: JSON — multi line prompts or large fan out (over 5 actions): cabinet actions { "type": "LAUNCH TASK", "agent": "editor", "title": "Draft hero copy", "prompt": "Outline the hero section...", "effort": "high" }, { "type": "LAUNCH TASK", "agent": "researcher", "title": "Benchmark", "prompt": "Pull pricing...", "effort": "low" } Cabinet dedupes identical proposals by fingerprint (type + agent + title + prompt + runtime), so if an agent accidentally repeats itself the same row doesn't show twice. The three action types | Action | Fires | Use it for | | | | | | LAUNCH TASK | Immediately on approval | One shot delegation — "Editor, draft this now." | | SCHEDULE TASK | Once, at a specific ISO datetime | Timed fire and forget — "Run this on Monday at 9am." | | SCHEDULE JOB | Recurring, on a cron expression | Durable heartbeat — "Every Monday 09:00, summarize last week." | SCHEDULE TASK that fires within 60 seconds is short circuited to a plain LAUNCH TASK — no point routing "in 30 seconds" through cron. Approving proposals When the dispatching agent finishes its turn, a pending actions panel appears underneath the final reply (same view in /agents/... , /tasks/... , and the detail panel). For each row you get: A checkbox to include or exclude the row from the batch. The action type (pink for launch, blue for schedule job, violet for schedule task). The target agent, title, and prompt preview. Any warnings : unknown agent , persona cannot dispatch , self dispatch , cycle risk , depth warning , inactive target , budget low , invalid schedule , invalid when . Hard warnings block the row ; soft warnings let you proceed if you accept the risk. Inline model and effort dropdowns (see below). Use Approve selected , Approve all (skips hard blocked rows), or Reject all to flush the queue. Approving spawns child conversations tagged with parentTaskId , triggeringAgent , and spawnDepth on their meta.json , so you can trace the dispatch tree back to the originator. Pinning model and effort per sub task By default, a child conversation picks its model and effort using this precedence: 1. Agent authored override — if the dispatching agent set model / effort on the action itself. 2. Parent inheritance — if the parent conversation's provider matches the target's, its model and effort are copied onto the child. A Claude Opus CEO dispatching to another Claude agent gets an Opus child without anyone asking. 3. Target persona defaults — the teammate's own adapterConfig in persona.md . Crossing providers (Claude parent → Codex child) drops the parent's model/effort automatically — no cross provider leakage . The target persona's provider and adapter always win; only the reasoning level travels. Override at approval time Each row in the pending actions panel has two small dropdowns: model — pick from the parent provider's catalog, or "Use default" to let inheritance run. effort — pick minimal / low / medium / high / xhigh / max , or "Use default" . Pick whatever you want before hitting Approve. Your override writes onto the spawned child's adapterConfig . Override in the action itself Agents can pin runtime directly inside their proposal. Inline: append | model= and/or | effort= as trailing segments. Unknown key=value segments are treated as prompt text, so it's safe to leave out either. JSON: add model and/or effort keys. The CEO's dispatch prompt already reminds every dispatch enabled agent about these fields, so you can just say "use high effort for the editor" in your ask and the agent will encode it. A quick end to end test Pick an agent with Can dispatch on, then send one of these prompts: Test A — fan out with explicit efforts Plan a product launch for next week. Don't edit any files yet — just propose the work. Dispatch a LAUNCH TASK to the editor to draft the hero copy (effort=high) and a LAUNCH TASK to the researcher to benchmark three competitors (effort=low). Summarize what you dispatched. What to look for: Two rows in the pending panel, with effort chips pre filled from the agent's proposal. Tweak the model/effort dropdowns on one row before approving. After approve, open each child — its meta.adapterConfig matches what you saw in the picker. Test B — parent inheritance Dispatch a LAUNCH TASK to one same provider teammate with prompt "write a haiku about Cabinet". Do not set model or effort — inherit from me. What to look for: The row shows model: Default / effort: Default . The spawned child's adapterConfig.model / .effort match the parent conversation's, because providers align. Test C — cross provider isolation Dispatch a LAUNCH TASK to a teammate on a different provider than me. Same prompt. What to look for: Child runs on the target's provider, adapter, and persona defaults — the parent's model does not leak across providers. Related Conversations & approvals — the safety story. Org chart & departments — how nested teams pass work around. Persona settings: .agents/ /persona.md — set canDispatch , default provider , adapterType , and adapterConfig there. The Can dispatch header pill writes back to that file. Back to Getting Started. ## Skills URL: https://runcabinet.com/getting-started/skills/ Skills in Cabinet Skills are reusable bundles of instructions (and optionally scripts) that an agent can pull in for a task. Each skill is a directory containing a SKILL.md (frontmatter + body) plus any helper assets it needs. Cabinet hosts skills locally, attaches them to personas, and mounts them into the agent's working directory at run time. This page covers what skills can do, where they live, and — most importantly — the security model you're opting into when you install one . What a skill is Each skill is a folder, e.g.: The SKILL.md is the part the model reads. Frontmatter declares name , description , and (optionally) allowed tools . The body is the playbook the model follows when the skill applies to a task. Where skills live Cabinet looks across five origins, in this precedence order on key collision: 1. cabinet scoped — data/ /.agents/skills/ (only visible inside that cabinet) 2. cabinet root — .agents/skills/ at the project root (the canonical place for skills you install via Settings → Skills) 3. linked repo — skills found in repos linked through .repo.yaml (TODO; not yet wired) 4. system — /.claude/skills/ and /.agents/skills/ (host wide, shared across CLIs); also Claude Code plugin marketplaces under /.claude/plugins/marketplaces/ 5. legacy home — /.cabinet/skills/ (kept for back compat) Cabinet managed origins (1 and 2) are editable from the UI; the rest are read only. Installing a skill Settings → Skills → Add skill accepts: github:owner/repo — repo IS the skill github:owner/repo/ or github:owner/repo@ — skill is a subdirectory or named entry in the repo github:owner/repo — pin to a branch / tag / commit SHA https://github.com/owner/repo /tree/ /path — paste a GitHub URL directly https://skills.sh/owner/repo /skill — pasted from skills.sh gitlab:owner/repo / local:/absolute/path — copy from a local directory (rare; useful when authoring) npx skills add skill — paste the install command from skills.sh as is The provenance gets written to skills lock.json (gitignored, per machine) so you can re fetch or audit any installed bundle. Per skill SHA 256 hashes are recorded so drift detection catches manual edits. Attaching skills to an agent Each persona has a skills: list in its frontmatter. Settings → Skills lets you attach/detach skills per agent, and the agent detail page shows a "Suggested for this role" panel for personas that ship recommendedSkills in their template. You can also @ mention a skill in any composer to attach it to the current run only (not persisted to the persona). The mention chip appears with a violet sparkles icon, and the skill is mounted alongside the persona's persisted skills for that conversation. How skills reach the model When a run starts, Cabinet: 1. Resolves each desired skill key against the catalog (via resolveDesiredSkills ). 2. Builds a skill index — a name + description block — and injects it into the agent's prompt so the model knows what's available without preloading bodies. 3. Materializes a per session plugin tmpdir at ${TMPDIR}/cabinet skills/ / containing .claude plugin/plugin.json plus skills/ / symlinks to each bundle. 4. Spawns the CLI with plugin dir add dir . Plugin dir registers the skills as discoverable /skill name commands; add dir grants file read access to bundle assets. 5. On session exit, removes the tmpdir. For continuation turns on structured adapters (e.g. Claude claude local ), each turn is a fresh spawn, so the skill mount is rebuilt per turn. New @ mentions made mid conversation are picked up live. For PTY/terminal mode continuations, the spawn is long lived and can't dynamically register new skills. Mid session @ mentions still reach the model via prompt text (the skill index is rewritten each turn), but they aren't discoverable as live slash commands until the next fresh task. The composer surfaces this as a "Heads up" banner when it applies. Security model — read this before installing third party skills Cabinet's default threat model is local first : the daemon binds to 127.0.0.1 and runs as a single user with no login out of the box. You can put the whole instance behind a password and reach it over a LAN or Tailscale (see Authentication & remote access), but skills still run with the full authority of that single user. Within that boundary, the choices below are deliberate: 1. No runtime trust gate Once you install a skill and attach it to a persona, every run mounts it. There is no per turn allow/block prompt. The trust signals (origin, audits passed pill, file inventory, allowed tools declaration) live in the install picker — once installed and attached, the skill is treated as authorized by your prior act. If you want to revoke a skill, detach it from the persona or delete the bundle from .agents/skills/ . 2. Claude runs with dangerously skip permissions The claude local adapter passes dangerously skip permissions so Cabinet can stream output without interactive permission prompts. This means any skill bundle's instructions can tell the agent to run shell commands, and Claude will execute them without asking . Don't install a skill you wouldn't be willing to run a shell script from. 3. Skill bundles get your .cabinet.env Spawned CLIs (and any scripts a skill invokes) inherit Cabinet's process env, which includes every key in .cabinet.env — OPENAI API KEY , GITHUB TOKEN , etc. A hostile skill can read them. The file is 0600 permissioned and gitignored, but the in process exposure is real. This is intentional (it's how skills like imagegen get their key without per run plumbing), but worth knowing. If you need to scope a key to one skill only, set it in your shell env instead and Cabinet won't write it to disk. 4. audits passed pills are signals, not gates The catalog browser fetches audit summaries from add skill.vercel.sh/audit (Alibaba Threat Hunter, Socket, Snyk, zeroleaks). A high pass count is a useful signal but not a blocker — you can install a skill with zero passing audits if you choose. Unavailable audits (network failure, skill not in the audit DB) show as "audits unavailable", not as a failure. 5. Symlinks in skill bundles are preserved verbatim When importing or bundling a skill, Cabinet uses fs.cp(..., { verbatimSymlinks: true }) — symlinks are copied as is rather than followed. This prevents a hostile bundle from exfiltrating files via a symlink pointing outside its own directory. 6. Path traversal protections Skill keys must be kebab case ( ^ a z0 9 a z0 9 $ , ≤64 chars). Anything containing / , .. , or whitespace is rejected. cabinet: scopes resolve through resolveContentPath , which enforces the DATA DIR boundary. Plugin manifests ( .claude plugin/plugin.json ) declaring relative paths that escape the cloned repo root are rejected during import. git clone branch rejects any ref that starts with or contains characters outside A Za z0 9. / . 7. The local: source is unrestricted local:/absolute/path lets you copy from anywhere on disk into .agents/skills/ . This is fine for a local only daemon (you can already read those files), but it does mean a malicious frontend bug could exfiltrate arbitrary directories into the skills root. Use it for skills you're authoring, not for general installs. Authoring your own skill Create a directory under .agents/skills/ / and drop in a SKILL.md : After creating it, refresh Settings → Skills; it'll appear in the Cabinet root section. Attach it to an agent and it'll be available on the next run. To share it, push the directory to a git repo and others can install via github:owner/repo/ . Backups Settings → Updates → Create backup has two checkboxes that affect skills: Skills ( .agents/skills/ ) — include installed skill bundles in the backup. Default off because they're per machine state. API keys ( .cabinet.env ) — include the env file. Default off because the backup is plaintext. Both default to off so a routine backup never accidentally captures secrets or per machine state. Tick them deliberately when you want a portable snapshot. Troubleshooting Skill installed but agent doesn't use it — check the agent's skills: list in the persona file. Installation only puts the bundle on disk; attachment is a separate step. plugin dir errors at spawn — the tmpdir layout is regenerated each run. If you see stale errors, restart the daemon to clear ${TMPDIR}/cabinet skills/ . Mid conversation mention doesn't seem to register on a terminal task — known caveat, see "How skills reach the model" above. Send the same skill mention from a fresh task and it'll mount cleanly. skills lock.json shows drift — Cabinet records per file SHA 256 at install. Manually editing a bundle reports as modified ; re installing or running npm run skills:sync resyncs the lock. See also Apps and repos — how Cabinet integrates with external tools Delegating between agents — how agents pass work to each other Skills (in Agents section) — the higher level mental model Back to Getting Started. ## Symlinks and Load Knowledge URL: https://runcabinet.com/getting-started/symlinks-and-load-knowledge/ Symlinks and Load Knowledge Cabinet uses direct symlinks to bring external folders into your knowledge base without copying anything. The folder stays where it is on disk — Cabinet just creates a pointer to it. How Load Knowledge works 1. Right click any item in the sidebar 2. Choose Load Knowledge 3. Pick a folder on your machine (or paste the path) 4. Optionally set a display name 5. Click Load Cabinet creates a symlink inside the KB: The folder's contents appear directly as children in the sidebar tree. No wrapper directories, no extra nesting. What gets written Cabinet writes two hidden dotfiles into the target folder : .cabinet meta Every linked folder gets this. Stores display metadata for the KB. Hidden from the sidebar. Cabinet also reads legacy .cabinet.yaml files when they already exist, but new links use .cabinet meta . .repo.yaml (git repos only) If the folder is a git repo, Cabinet auto detects the branch and remote and writes a .repo.yaml so AI agents can read the source code in context. If a .repo.yaml already exists in the folder, Cabinet skips writing it. Both dotfiles are hidden from the sidebar by default. Sidebar icons | Icon | Color | Meaning | | | | | | GitBranch | Orange | Linked git repo (has .repo.yaml ) | | Link2 | Blue | Linked non repo directory | Unlinking To remove a linked folder: 1. Right click the linked item in the sidebar 2. Choose Unlink This removes only the symlink from the KB. The original folder and all its files are untouched . The .cabinet meta dotfile in the target is also cleaned up. Changing the data directory By default, Cabinet stores content in ./data (dev mode) or a platform specific app data path (Electron). Override with the CABINET DATA DIR environment variable: You can also make data/ itself a symlink pointing elsewhere — the tree builder follows symlinks transparently. Tips Linked folders with an index.html (and no index.md ) render as embedded websites Add a .app marker for full screen mode If the target folder has its own index.md , Cabinet uses it as the landing page Agents discover linked repos by reading .repo.yaml in the current or any parent directory Back to Getting Started. ## Guides URL: https://runcabinet.com/guides/ Guides Practical workflows for using Cabinet. Create New Cabinet Connect Knowledge Tasks and Routines Skills Showcase ## Apps & repos URL: https://runcabinet.com/guides/apps-and-repos/ Apps & repos Cabinet goes beyond markdown pages. You can embed full web applications , link external Git repositories, and create interactive tools that live right alongside your documentation. Embedded apps Any directory that contains an index.html file and no index.md is treated as an embedded app. Cabinet renders it in an iframe. Standard embedded app The app renders in the main content area with the sidebar and AI panel still visible. Good for dashboards and reference tools you want to glance at while working. Full screen app Add a .app marker file in the directory and Cabinet expands the iframe to full screen, hiding the sidebar. Use full screen for immersive tools — pipeline dashboards, custom Kanban boards, embedded apps you want to feel like a Cabinet page. Linked Git repos A folder with a .repo.yaml at the root is treated as a Linked Git Repo. Cabinet gives agents extra context about the repo: branch, commit log, file structure, recent diffs. The folder still behaves like a normal cabinet folder — pages render, files are editable, agents can write into it. The repo metadata just makes agents aware of git context. Embedding inside a markdown page Sometimes you want to embed a small interactive widget inline, not as a full app. Use the embed slash command: /Embed — paste any URL (YouTube, Vimeo, Loom, X, etc.). Cabinet auto detects the provider. For raw iframes, paste an iframe tag in source mode. Read on Connect Knowledge — local & cloud folders, .cabinet meta , CABINET DATA DIR . Reference → Supported file types — what else Cabinet renders inline. ## Authentication & remote access URL: https://runcabinet.com/guides/authentication/ Authentication & remote access By default Cabinet is local first : the servers bind to 127.0.0.1 and there is no login. If you only ever open Cabinet at http://localhost:4000 on your own machine, that is a reasonable default and you can skip this page. The moment Cabinet is reachable by anything other than your own loopback (a LAN, a Tailscale tailnet, a VPN, your phone), turn on the password gate. This page covers how, and how to expose Cabinet safely. Turn on the password gate Set KB PASSWORD in your .env (or your process manager / container environment): With it set, every page and API route requires login: Cabinet shows a /login page, redirects unauthenticated page requests there, and rejects unauthenticated API requests with 401 . Leave KB PASSWORD empty to disable auth entirely. Restart Cabinet after changing it. How the session is protected When you log in, Cabinet sets a single kb auth cookie. It is not a fast hash of your password: Slow KDF. The cookie value is PBKDF2 HMAC SHA256 over your password (600,000 iterations by default), which makes guessing expensive. Per install salt. A random salt is generated once and stored in .cabinet.env , so tokens are unique to your install and cannot be attacked with precomputed tables. Login rate limiting. Repeated failed logins are throttled (per client, plus a global ceiling) and locked out for a cool down window, returning 429 Too Many Requests with a Retry After . Constant time checks. The gate compares tokens in constant time and derives the expected value once per process, so it adds no meaningful per request cost. Changing your password (or the salt or iteration count) invalidates existing sessions, so everyone logs in again once. Configuration | Variable | Default | What it does | | | | | | KB PASSWORD | (empty) | Set it to require login. Empty means no auth. | | CABINET AUTH SALT | (auto) | Per install salt, auto generated into .cabinet.env . Set only to pin a value. | | CABINET LOGIN PBKDF2 ITERS | 600000 | KDF cost. Lower only on very constrained hardware. | | CABINET LOGIN MAX ATTEMPTS | 10 | Failed attempts per client before lockout. | | CABINET LOGIN WINDOW MS | 900000 | Counting window (15 minutes). | | CABINET LOGIN LOCKOUT MS | 900000 | Lockout duration once tripped (15 minutes). | | CABINET LOGIN GLOBAL MAX | 60 | Global failed attempt ceiling per window. | | KB ALLOW HTTP | (unset) | Set to 1 to drop the cookie's Secure flag in production (plain HTTP on a trusted network only). | Background automation and the gate The gate covers Cabinet's own background work too. Scheduled jobs and persona heartbeats are fired by the scheduler daemon — a process separate from the web app — and it authenticates with the same kb auth cookie a logged in browser carries. Because it is a separate process, the daemon must see the same auth values as the app: KB PASSWORD , CABINET AUTH SALT , and CABINET LOGIN PBKDF2 ITERS . If any of them differ between the two, the daemon derives a different token, every scheduled trigger is rejected with 401 , and nothing runs — while /health still reports status: ok with a non zero scheduledJobs , so the failure is easy to miss. In practice this usually takes care of itself: the salt lives in .cabinet.env (both processes read it at boot), and the daemon backfills KB PASSWORD and CABINET LOGIN PBKDF2 ITERS from .env in its working directory when they aren't already in its environment. The one case to watch is setting auth only through a process manager or container environment for the app, with no .env the daemon can read — then keep the daemon's environment in sync too. To confirm automation is actually running, check /health : alongside scheduledJobs it reports lastTriggerAt , lastSuccessfulTriggerAt , lastFailedTriggerAt , and triggerFailures . Triggers firing ( lastTriggerAt advancing) while lastSuccessfulTriggerAt stays stale and triggerFailures climbs is the signature of a token mismatch. Reaching Cabinet from another device Cabinet can run behind a LAN address, a Tailscale tailnet, a VPN, or a reverse proxy. Two things to set: Dev origin allowlist. When you run the dev server behind a non localhost hostname, set CABINET APP ORIGIN to that origin (comma separated for more than one) so cross origin requests for dev assets are allowed: Use HTTPS. The auth cookie is marked Secure in production, so it is only sent over HTTPS. Tailscale and most VPNs give you encrypted transport. If you must serve plain HTTP on a trusted private network, set KB ALLOW HTTP=1 , but prefer HTTPS. Exposing Cabinet safely: checklist Set a strong KB PASSWORD . Reach it over an encrypted path (HTTPS, or a private network like Tailscale). Keep it off the open public internet unless you have put your own auth/proxy in front and understand the tradeoffs. What this is, and what it is not Cabinet's gate is a single shared password for the whole instance. There are no per user accounts, roles, or per user audit. It is designed to keep a self hosted instance private on a network you trust, not to be a multi tenant identity system. Agents and skills run with the full authority of that single user. For the full threat model and the exact token derivation, see docs/AUTH.md in the repository. ## Features URL: https://runcabinet.com/guides/features/ Features Everything Cabinet does, on one page. Each feature links to the deep dive. Knowledge & editor The surface where you read, write, and search. | Feature | What it is | Read more | | | | | | WYSIWYG editor | Rich text with bubble menu, slash commands, callouts, math, embeds. Roundtrips to plain markdown. | Guides → Write & edit | | File tree with first class types | Markdown, CSV, PDF, code, mermaid, images, audio, office docs, embedded apps — all render inline. | Reference → Supported file types | | ⌘K full text search | Searches the current room (opt in to search other rooms). Surfaces matches in milliseconds. | — | | Wiki links and @ mentions | Type Page Name or @Page to link or attach as agent context. | — | | Git backed page history | Click the clock icon on any page to see every change, diff them, restore. | — | | Highlights, colors, callouts | Yellow key terms, red urgency, green confirmations. Inline marks roundtrip through markdown. | — | AI team Where the work gets done. | Feature | What it is | Read more | | | | | | Personas | One markdown file per agent. Edit the file, the agent updates. | Agents → Persona | | Heartbeats | Recurring check ins on a cron schedule. Decides what to do at a moment. | Agents → Heartbeats | | Routines | Tasks that recur. Same prompt, same output shape, every Friday. | Agents → Routines | | Tasks board | Kanban / list / schedule views. Filter by agent, trigger, or status. | Agents → Tasks | | Approvals queue | Every cross agent action queues for one click human approval. | Agents → Conversations & approvals | | Org chart & departments | Departments are folders. Leads can dispatch. Specialists stay in lane. | Agents → Org chart | | Skills | Installable instruction packs from skills.sh. Allow list security. | Agents → Skills | | BYOAI | Connect Claude, GPT, Gemini, Grok, or local. Pick per agent or per task. | Agents → BYOAI | Cabinets The file format and what it makes possible. | Feature | What it is | Read more | | | | | | .cabinet manifest | One YAML file names the cabinet, sets the entry page, and parents it. | Reference → Manifest schema | | Child cabinets | Nest cabinets inside cabinets. Each one has its own agents and visibility. | Philosophy | | Connect Knowledge | Point at any local or cloud folder (Drive, iCloud, OneDrive, Dropbox). Cabinet links it, no copy. | Guides → Connect Knowledge | | Linked git repos | A folder with .repo.yaml becomes a repo Cabinet's agents can reason about. | Guides → Apps & repos | | Embedded apps | A folder with index.html renders as an iframe in the main panel. | Guides → Apps & repos | | Google Workspace pages | A markdown page with google: frontmatter becomes a live Sheet/Doc/Slide. | — | | Office docs | Drop .docx , .xlsx , .pptx and they render inline read only. | — | Integrations What Cabinet connects to. | Feature | What it is | Status | | | | | | MCP servers | Connect any Model Context Protocol server as a tool surface. | live | | Slack | Trigger tasks, get approvals, receive briefings. | soon | | Telegram | DM your agents. Approve from the lock screen. | soon | | Gmail / Calendar | OAuth connected inbox triage and meeting prep. | soon | | GitHub | PR triage, issue grooming, release prep. | soon | | skills.sh | Public registry of agent skills. | live | | cabinets.sh | Public registry of template cabinets. | live | Ergonomics The small stuff that adds up. | Feature | What it is | | | | | Themes | Pick from a curated set of light and dark themes — Paper, Slate, Claude, Ink. | | Keyboard shortcuts | Press ? anywhere for the searchable cheat sheet. | | Web terminal | ⌘ opens an interactive terminal in the workspace. | | Drag & drop | Reorder pages in the sidebar. Drop files onto the editor to upload. | | Source mode toggle | Every page has a Source toggle for the raw markdown. | Read on Philosophy — why all of this is one folder, not five tools. Showcase — the live agents workspace and task board. Reference — every YAML schema, every CLI command. ## Connect Knowledge URL: https://runcabinet.com/guides/load-knowledge/ Connect Knowledge Connect Knowledge brings folders you already have, on your machine or in the cloud, into a Cabinet room. Nothing is copied or uploaded. Cabinet points at the folder where it lives, so its files show up in the sidebar and your AI agents can read them as context. Open the picker Right click the data area or any folder in the sidebar and choose Connect Knowledge . A tile picker opens with your options: Local folder brings in any folder on your computer. Google Drive, iCloud Drive, OneDrive, SharePoint, Dropbox bring in a cloud folder, read straight from that service's desktop sync app. No sign in, no API keys. Notion, Confluence are app connectors, so their tiles take you to the Integrations Hub. Anything already installed on your Mac also appears under Detected on this Mac for one click. Connections are per room . A folder you connect in one room does not show up in another. Local folders Choose Local folder , pick a folder (or paste a path), and Connect. The folder's contents appear directly in the tree, for example /Users/you/Development/my repo/ shows up as ./my repo/ . Edits stay in the original location. If the folder is a git repo, Cabinet auto detects it and writes a .repo.yaml so agents get extra context about commits, branches, and history. See Apps & repos. Cloud folders Choose a cloud service. Cabinet finds its local sync folder, lets you browse to the sub folder you want, and asks how to connect it: View only (the default). Agents can read the files, but nothing in Cabinet can change them. Read and write . Edits you make in Cabinet sync back to the cloud. A cloud folder can land in two places: Inline , right where you clicked in the tree, marked with the service's logo and, for view only folders, a small "view" badge. In a cloud browser section for the room, when you connect from the room's top level. Google Docs, Sheets, and Slides always open in a read only viewer, since they live in Google's editor rather than as plain files. Read only keeps your files safe When you connect a folder as view only, Cabinet protects it everywhere. The page opens in a read only editor, and the menu hides rename, move, and delete. Your agents can read those files, but they cannot change them. This makes it safe to point Cabinet at a shared drive or a folder you do not want touched. Tracking metadata about a connected folder For a local folder, add a .cabinet meta file next to (or inside) it: Cabinet picks up the metadata on the next scan. The title shows in the sidebar; the description shows on hover. Disconnecting Right click a connected folder and choose Unlink (or Disconnect for a cloud folder). Cabinet removes only its pointer. The original folder and every file in it are left exactly as they were. CABINET DATA DIR Cabinet looks for cabinets at $CABINET DATA DIR (default /cabinets/ ). Set the env var to point at a different location: This is useful if you keep cabinets on an encrypted volume or a synced folder. Read on Apps & repos for embedded apps and linked repos. Reference → File structure for what lives inside a cabinet folder. ## Tasks and Routines URL: https://runcabinet.com/guides/tasks-and-routines/ Tasks and Routines Tasks are one off pieces of work. Routines are tasks that run on a schedule. Good task examples: Launch ten separate competitor brief tasks and synthesize the results. Draft a go to market launch room with positioning, channels, objections, and a checklist. Produce six product audit reports: onboarding, pricing, docs, activation, churn, and trust. Draft a week of LinkedIn posts for human review. Good routine examples: Scan product feedback every morning. Prepare a weekly metrics brief. Summarize new research every Friday. Turn new support themes into Discord ready release notes. The important Cabinet pattern is that outputs should become files in the knowledge base. ## Tips & best practices URL: https://runcabinet.com/guides/tips/ Tips & best practices The small habits that compound. Skim by section. Getting the best results from agents Anchor every agent to a folder. Agents that own a folder write predictable things in predictable places. Agents that "help with everything" produce noise that's hard to revisit. Pick a folder, name it after the work, point the agent at it. Write the system prompt like a job description. Title, scope, what they own, what they should never do, how they hand off. Avoid abstractions. "Always write to /sales/changelog.md" beats "stay organized." Set visibility deliberately. A specialist with visibility: folder is fast and cheap. A lead with visibility: cabinet is aware. Almost nobody needs visibility: all . Use heartbeats for the morning, not the moment. A heartbeat that fires every 15 minutes is a notification system. A heartbeat that fires once a day at 9am is a teammate. Default heartbeats to silence. Write the prompt so the agent only escalates new or important findings. The good ones run for weeks without paging you. CLI power user ⌘N from anywhere opens the task composer. The fastest path from "I want X" to a queued task. ? opens the searchable shortcut sheet. Filter by name or key. Better than memorizing. ⌘ toggles the web terminal. A real shell in the workspace. Use it for git log , find , quick scripts. ⌘K + command jumps straight to a command. Like Spotlight but for Cabinet actions. /save in any chat persists the conversation as a page. No more "this was a great chat, where did it go." /compact shortens a long chat without losing the highlights. Useful before a hand off to another agent. Context files & mentions @PageName attaches a page as agent context. Works in chats, task composers, and skill prompts. @folder/ attaches a whole folder. The agent gets the directory listing plus the index page. Page Name wiki links autocomplete. Type two brackets, start the title, hit tab. AGENTS.md at any folder root is auto loaded. Use it like CLAUDE.md — write the working agreements for that area of the cabinet. Memory & skills Edit memory.md like any page. If an agent learned something wrong, just open the file and fix it. No magic, no migration. Memory should fit on one screen. When an agent's memory.md grows past 200 lines, run /compact memory in their chat. Cabinet rewrites it shorter. Skills are folders. Treat them like libraries. Version them, write a README, ship them to skills.sh when they're useful to others. An empty allowed tools list is the safest skill. Read only skills never break anything. Performance & cost Cheap model for triage, careful model for synthesis. Use Haiku/GPT 4.1 mini for inbox sweeps and dispatch. Save Opus for the weekly synthesis. Set per task budgets in .cabinet . A single hard cap ( budget.perTask.maxCostUsd: 5 ) prevents runaway runs. Fallback chains save the day. Configure fallbacks.claude opus 4 8 to drop to Sonnet, then GPT, when the primary 429s. Local models for private data. Ollama + a 70B model is competent for most internal work. Zero API spend. Avoid visibility: all on lead agents. It pulls the whole cabinet into context on every run. Cost adds up quickly. Privacy & local first Cabinet doesn't phone home. No telemetry by default. The only network calls are the ones agents make to your configured providers. providers.localOnly: true in .cabinet hard locks to local models. Useful for sensitive cabinets (clients, legal, medical). .gitignore what shouldn't be shipped. Default: .chat/ , .cabinet state/ , .cabinet.db . Add anything cabinet specific (raw client lists, API keys you accidentally committed). Templates strip .gitignore 'd files at publish time. cabinetai publish won't ship secrets if they're in .gitignore . CABINET DATA DIR can be encrypted. Cabinet doesn't care where its files live. Point it at a FileVault / LUKS volume. Publishing & templates Test your template by installing it from a fresh clone. npx cabinets add ./your template path works on local folders too. The description field on .cabinet is your hook. ≤80 chars, present tense, action oriented. "Run your job search like a sales pipeline" beats "A cabinet for searching jobs." Strip your real data before publishing. Replace your CSV rows with synthetic ones. Make it obvious. Real users will fill in their own. Pin model names that exist. A template that says model: claude 3 7 breaks for everyone after the model retires. Use the defaults in the manifest so users can override. Document heartbeats in the body of persona.md . When the install confirmation prompts the user, the heartbeat label is what they read. Read on Install — start here if you haven't. Agents — the conceptual model. Templates — the registry. ## Write & edit URL: https://runcabinet.com/guides/write-and-edit/ Write & edit Cabinet's editor is Notion grade WYSIWYG on top of plain markdown. Everything you type roundtrips to a file on disk. Toggle Source in the top right to see the raw markdown anytime. Bubble menu Select any text and the bubble menu appears. Use it for bold , italic , highlight , color, alignment, and links. Selections roundtrip through markdown as inline HTML so styling survives a file save. Slash commands Press / on an empty line to open the command menu, grouped into Basic , Media , and Advanced . | Group | Commands | | | | | Basic | Text, H1/H2/H3, Bullet, Numbered, Checklist, Code block, Quote, Divider, Table | | Media | Image, Video, Embed, File | | Advanced | Callout, Warning, Math, Emoji | Images, videos, embeds Three ways to add an image, all save the file next to the page on disk: 1. Paste a copy pasted screenshot — uploads and inserts automatically. 2. Drag & drop from Finder onto the editor. 3. Click the image icon or type /Image for the Upload or From URL tab. Hover any image and drag side handles to resize — width persists across reloads. For videos and embeds, type /Video or /Embed . Cabinet auto detects YouTube, Vimeo, Loom, X, TikTok, Spotify, Facebook, Instagram, and more — paste a recognized URL on an empty line to auto embed without the popover. Highlights & colors Pick text color or background highlight from the toolbar or bubble menu. Use them with intent: Yellow highlights for key terms. Blue backgrounds for cross references. Red text for urgency / blockers. Green text for confirmations / shipped items. Amber highlights for tips / notes. They roundtrip through markdown as and tags so other tools (and git) can read them. Callouts, math, emoji, checklists | Command | What you get | | | | | /Callout | Info block with left border | | /Warning | Amber warning block | | /Math | Inline KaTeX (or wrap in $…$ / $$…$$ ) | | /Emoji | Picker (or paste unicode 🚀 directly) | | /Checklist | Task list with checkboxes | Wiki links and @ mentions Type Page Name to link another page (autocompletes the slug). In the AI panel use @PageName to attach pages as context for the agent. Drag handle Hover any block and a ⋮⋮ handle appears in the left margin. Drag it to reorder paragraphs, lists, embeds, or images. Source mode Every editor view has a Source toggle in the top right. Click it to see (and edit) the raw markdown that will be written to disk. Read on Tips → CLI Power User — the keyboard flow that compounds. Reference → Supported file types — what renders inline beyond markdown. ## Install Cabinet URL: https://runcabinet.com/install/ Install Cabinet Get from zero to a running cabinet in under five minutes. The first run wizard creates your data folder, seeds an example cabinet, and asks you to plug in one model API key. Who this is for You want a local first knowledge base where every page is a markdown file on disk and a team of AI agents can edit and run jobs against it. If you're brand new, read Philosophy first — it's the 90 second pitch. Supported systems | System | Status | Notes | | | | | | macOS 12+ | Fully supported | Native Electron app or npx CLI. Apple Silicon and Intel. | | Linux | Untested | Should work via the npx CLI (Cabinet is Node + Electron — both fully Linux compatible) but hasn't been verified yet. Try it and share what breaks. | | Windows | Via WSL2 | Run inside WSL2 (Ubuntu recommended). Native Windows support is on the roadmap. | | Requirement | Version | How to check | | | | | | Node.js | 22+ (LTS) | node v — repo ships an .nvmrc , run nvm use to auto switch | | git | any recent | git version | | An AI CLI | latest | One of: Claude Code, Codex CLI. See Bring your own AI. | Install — Mac native app (Electron) Easiest path on macOS. Download the .dmg , drag Cabinet into Applications, double click. No terminal required. → Download Cabinet for Mac (.dmg) Both Apple Silicon (M series) and Intel builds are published with each GitHub Release. The first launch asks for the same things the CLI does — a folder for your cabinets, and an AI provider. Note. macOS may ask you to confirm the app on first open (Apple Gatekeeper). Right click → Open if you see "unidentified developer." Install — npx CLI (any platform) Open the URL printed in your terminal (usually http://localhost:4000 ). The wizard creates a data folder, seeds an example cabinet, and prompts for one model API key. Tip. Cabinets live anywhere on disk. Set CABINET DATA DIR=/path/to/folder before npm run dev:all to use a different location. Your folder is your data ; the app is just a viewer. Pick a model provider Cabinet is bring your own AI . You connect the providers you already pay for. There's no Cabinet middleman, no inference markup, no quota. | Provider | Best for | Get a key | | | | | | Anthropic Claude | Default for most agents — long context, careful writing | console.anthropic.com | | OpenAI GPT | Cheap routing, strong tool use, fast | platform.openai.com | | Google Gemini | Long context research, low cost per token | aistudio.google.com | | xAI Grok | Latest news, code, lighter weight tasks | console.x.ai | | Local (Ollama / LM Studio) | Offline, private, no API bill | ollama.com / lmstudio.ai | You can connect multiple providers and pick a default per agent or override per task. Verify it worked Three checks. If any fail, jump to common failure modes below. 1. The sidebar shows index.md selected. 2. Press ⌘K (or Ctrl+K ) — search opens. 3. Press ⌘⇧A — the AI panel opens on the right. If all three pass, your cabinet is alive. Now go meet your team. Try your first agent Open .agents/ in the sidebar. Click any persona. Click Hire . The agent appears in your AI team panel with the Active dot lit. Click their avatar to chat with them, or assign a task on the Task Board. Don't have a team yet? Templates ship complete teams in one command: Common failure modes | Symptom | Likely cause | Fix | | | | | | EADDRINUSE :3000 | Old dev server still bound | lsof i :3000 then kill the PID, or set PORT=3001 | | Blank editor on first load | Model API key missing or invalid | Open Settings → Providers, paste your key, refresh | | npm ERR! 401 on install | Stale auth token in /.npmrc | npm config delete authToken , then retry | | Sidebar says "no cabinets" | CABINET DATA DIR points at an empty folder | Unset it, or run npx cabinetai create inside it | | Agent says "no API key" mid chat | Provider keyed but model not allowed | Settings → Providers → enable specific models | | First run wizard hangs | Firewall blocks fonts.googleapis.com | Allow it, or use the offline build ( npm run dev:offline ) | Recovery toolkit When things look broken, run these in order: Your cabinet folders are your data. uninstall only removes the cached app — it never touches your /cabinets/ folders. Quick reference | Command | What it does | | | | | npx create cabinet@latest | Scaffold a new cabinet folder and start the app | | npx cabinetai run | Start Cabinet against the current folder | | npx cabinetai create <name> | Create a new cabinet inside this one | | npx cabinetai add <owner/repo> | Install a template cabinet from cabinets.sh | | npx cabinetai doctor | Diagnose install + provider issues | | npx cabinetai update | Reinstall the latest version | | npx cabinetai uninstall | Remove cached app (keeps your data) | | ⌘K | Open search | | ⌘⇧A | Toggle AI panel | | ⌘ | Toggle web terminal | | ? | Open keyboard cheat sheet | See the full CLI reference for every flag and exit code. Next steps Meet your AI team — what personas, heartbeats, and routines actually are. Browse template cabinets ↗ — start with a pre built team for your job. Showcase — see the agents workspace and task board live. Tips and best practices — the small habits that compound. ## Integrations URL: https://runcabinet.com/integrations/ Integrations What Cabinet connects to. Grouped by category, with status pills. AI providers Cabinet is bring your own AI . Connect the providers you already pay for; Cabinet routes your agents' calls. There's no Cabinet middleman, no inference markup. | Provider | Best for | Status | | | | | | Anthropic Claude | Long careful writing, strong reasoning | live | | OpenAI GPT | Fast triage, cheap routing, strong tool use | live | | Google Gemini | Long context research, low cost per token | live | | xAI Grok | Fresh news access, lighter tasks | live | | Local — Ollama / LM Studio | Offline, private, no API bill | live | | OpenRouter | One key, many providers, automatic fallback | soon | | Together / Groq / Replicate | Specialty model hosts | soon | → Read BYOAI for routing, fallbacks, budgets. Tool servers (MCP) Model Context Protocol servers add tool surfaces to your agents. Cabinet connects via stdio or HTTP transport. | MCP server | What it gives agents | Status | | | | | | filesystem | Read/write inside a folder (built in) | live | | chrome devtools | Drive a browser, take screenshots | live | | github | Issues, PRs, file ops, search | live | | gws (Google Workspace) | Sheets / Drive / Gmail / Calendar via service account | live | | playwright | Heavier browser automation | live | | figma | Read components and designs | live | | stripe | Customer / subscription / invoice ops | live | Add an MCP server to a cabinet by writing one file at .mcp/servers.json — Cabinet picks it up on next boot. Connectors (live messaging surfaces) Push notifications, approve from your phone, trigger tasks from a DM. | Connector | What it does | Status | | | | | | Slack | Trigger tasks, get approvals, receive briefings | soon | | Telegram | DM your agents. Approve from the lock screen. | soon | | Discord | Channel driven approvals + briefings | soon | | Email (IMAP/SMTP) | Inbox triage, draft replies, follow ups | soon | | SMS (Twilio) | One line approvals on the road | soon | | iMessage (BlueBubbles) | Mac only iMessage bridge | later | Each connector ships as an MCP server + a Cabinet plugin. Authorization is OAuth where possible, scoped tokens where not. File sources Beyond editing files in the cabinet folder, Cabinet can read your data where it already lives . | Source | How it's wired | Status | | | | | | Symlinks ("Load Knowledge") | Right click → Load Knowledge → pick a folder | live | | Linked git repos | Folder with .repo.yaml | live | | Embedded apps | Folder with index.html | live | | Google Workspace pages | Markdown page with google: frontmatter | live | | Office docs | .docx / .xlsx / .pptx render inline read only | live | | Notion import | Read only import from a Notion workspace | soon | | Obsidian vault adoption | Open an Obsidian vault as a cabinet (zero conversion) | live | Skill marketplaces Where agents pick up new instructions. | Marketplace | What's there | Status | | | | | | skills.sh | Public registry of agent skills, with security scans | live | | GitHub URLs | Install from any public repo with a SKILL.md at the root | live | | Bundled | Common skills (research synthesis, code review, doc edits) ship with the app | live | → Read Skills for how a SKILL.md is structured and the security model. Template marketplaces Where you find pre built cabinets. | Marketplace | What's there | Status | | | | | | cabinets.sh | Public registry of plug and play cabinets — full AI teams in one folder | live | | GitHub URLs | Install any public repo with a .cabinet at the root | live | | Local folders | npx cabinets add ./my template works on local paths too | live | Smart home & devices | Integration | What it does | Status | | | | | | Home Assistant | Cabinet as the brain on top of your HA setup | later | | Voice (TTS / Whisper) | Voice in / voice out for agent chats | soon | Read on BYOAI — provider routing, fallbacks, local only mode. Skills — the security model around installable instructions. Templates — pre built cabinets you install in one command. Reference → Manifest schema — where provider routing config lives. ## Philosophy URL: https://runcabinet.com/philosophy/ One place for all your work Most of your day is spread across tools that don't know each other. Notes in Notion. Files on Drive. Tasks in Linear. Threads in Slack. Research in chat windows. Drafts in Docs. Screenshots in Downloads. Nothing compounds. Every Monday you reassemble the picture by hand. Cabinet collapses that into one folder on your computer . Inside it lives everything: your knowledge, your files, your AI agents, their schedules, their memory, their outputs. You open one app and everything is there. You close your laptop and an AI team keeps working. Two pictures of the same idea If you don't write code. Cabinet is a smarter folder . You write notes. You drop in PDFs, docs, spreadsheets, and screenshots. You describe a person you wish you'd hired — "an analyst who reads my inbox every morning and tells me what's urgent" — and that person exists, in the same folder, getting better at the job over time. If you do write code. Cabinet is a local first, git tracked knowledge tree . Every page is a markdown file. Every agent is a persona.md . Every scheduled job is a YAML file in .jobs/ . The whole thing is portable, scriptable, and yours. No database. No cloud. No lock in. ls and you see your work. git log and you see its history. Why "one place" matters A scattered tool stack means scattered context. An assistant in ChatGPT can't see your meeting notes. An agent in Linear can't see your research. A scheduled job in Zapier can't write back into your brain. Cabinet's bet is that knowledge, work, and the workforce have to live in the same folder for any of it to compound. The team that drafts your launch should be able to read last quarter's launch. The agent that summarizes your week should be able to write the summary into the same place you'll go looking for it. Your AI team works 24/7 — without you babysitting Real teams have rhythms: a Monday standup, a Friday update, an inbox check at 9am. Cabinet agents have the same. Tasks — one thing, runs once. "Draft the launch post." Routines — a task on a schedule. "Draft the launch post every Friday." Heartbeats — a recurring check in the agent uses to decide what to do next. "Every weekday at 9am, look at the launch room and tell me what changed." Heartbeats are the difference between an assistant you have to summon and a teammate who shows up. You go to sleep; the team keeps doing the work that doesn't need you. You wake up to durable pages in your knowledge base — not a chat transcript you'll never reread. Bring the brains you already pay for Cabinet doesn't host inference. You connect Claude, GPT, Gemini, Grok, or a local model , and Cabinet routes your agents' calls to them. There's no Cabinet middleman, no inference markup, no quota. A team of teams A real company isn't one big team. It's a tree: a CEO at the top, departments under that, projects under those, each with its own people and knowledge. Cabinets nest the same way. The root cabinet is your company, your life, your project. Child cabinets are departments — marketing/ , research/ , clients/acme/ . Each child cabinet has its own agents, its own jobs, its own visibility scope. Agents up the tree can dispatch work to agents below them. Every proposal is queued for one click human approval before anything runs. You don't have to start from a blank folder. cabinets.sh is a public registry of plug and play cabinets — a complete AI team for a job hunt, a solo startup, a wedding, a podcast, a property portfolio. Clone one folder, run one command, and you have a team : Open it in Cabinet. Every agent, every job, every page is already there. Edit a persona, change a schedule, point a job at a different folder — make it yours. What to read next Install Cabinet — get the app running in five minutes. Meet your AI team — personas, heartbeats, routines, the whole crew. Browse templates ↗ — start with a pre built team. Showcase — see the agents workspace and task board live. Stories — how real people use Cabinet. Cabinet File Format — what's actually on disk. ## Reference URL: https://runcabinet.com/reference/ Reference Technical details for Cabinet users and builders. CLI Reference File Structure ## CLI Reference URL: https://runcabinet.com/reference/cli/ CLI Reference Cabinet's CLI is intentionally small. Most of the work happens inside the app , and the CLI exists to start, scaffold, diagnose, and update. If you've installed Cabinet globally, drop the npx . Everything below uses cabinetai for short. Commands at a glance | Command | What it does | | | | | create | Scaffold a new cabinet folder | | run | Start Cabinet against the current cabinet folder | | list | List cabinets visible to this install | | add | Install a template cabinet from cabinets.sh | | doctor | Diagnose env, ports, providers, db | | sessions | Manage active sessions and locks | | skills | Install, update, publish skills | | publish | Publish the current cabinet to cabinets.sh | | update | Reinstall the latest version | | uninstall | Remove cached app (keeps your data) | Global flags | Flag | What it does | | | | | data dir <path> | Override CABINET DATA DIR for this run. | | port <n> | Override the default port (3000). | | quiet | Suppress non error output. | | json | Emit machine readable JSON instead of human output. | | no color | Disable ANSI color in terminal output. | | help | Print help for any command. | Environment | Variable | Default | Purpose | | | | | | CABINET DATA DIR | /cabinets/ | Where Cabinet looks for cabinet folders. | | CABINET LOG LEVEL | info | debug / info / warn / error . | | CABINET OFFLINE | false | Skip provider connectivity checks at boot. | | ANTHROPIC API KEY | — | Picked up automatically. | | OPENAI API KEY | — | Picked up automatically. | | GOOGLE API KEY | — | Picked up automatically. | | XAI API KEY | — | Picked up automatically. | Exit codes | Code | Meaning | | | | | 0 | Success | | 1 | Generic error (see stderr) | | 2 | Bad input (missing arg, unknown flag) | | 3 | Cabinet not found at the given path | | 4 | Port in use | | 5 | Provider auth failure | | 6 | Schema violation (a malformed persona / job / skill) | create Scaffold a new cabinet folder. | Arg / flag | Default | What it does | | | | | | name | prompts | Folder name. Sluggified for the cabinet id. | | template <slug> | empty | Start from a template cabinet on cabinets.sh. | | dir <path> | $CABINET DATA DIR | Parent directory. | | no install | false | Skip npm install after scaffold. | Examples run Start Cabinet against the current folder (or a specified cabinet). | Arg / flag | Default | What it does | | | | | | path | . | Cabinet folder to open. | | port <n> | 3000 | Port to bind. | | open | true | Open the browser automatically. Use no open to disable. | | read only | false | Disable agent runs, edits, and git writes. Useful for demos. | Examples list List cabinets visible to this install. Reads $CABINET DATA DIR for any folder with a .cabinet manifest at the top level. Output add Install a template cabinet from cabinets.sh. | Arg / flag | Default | What it does | | | | | | <owner/template> | required | Template slug on cabinets.sh, e.g. cabinet app/job hunt hq . | | into <path> | $CABINET DATA DIR | Where to install. | | name <name> | template's id | Rename on install. | Heartbeats are paused on first install. Cabinet asks you to confirm each one before it fires. doctor Diagnose environment, ports, providers, and database integrity. | Flag | What it does | | | | | fix | Attempt safe auto fixes (kill stale ports, clear bad locks). | | json | Machine readable output for CI / scripts. | Checks: Node version ≥ 20 Git installed $CABINET DATA DIR exists and is writable Default port is free Each configured provider responds to a ping The cabinet's SQLite ( .cabinet.db ) is healthy sessions Manage active agent sessions and locks. skills Install, update, and publish skills. Use force only if you've reviewed the security scan output. publish Publish the current cabinet folder to cabinets.sh. Strips .gitignore 'd files, generates a README, validates schemas, and opens a PR to the registry. update Reinstall the latest Cabinet app version. Your data is untouched. Only the cached app version changes. uninstall Remove the cached Cabinet app from your machine. Your cabinet folders are not affected. They live wherever $CABINET DATA DIR points (default /cabinets/ ) and stay where they are. Read on Install — the runbook. File structure — what's inside a cabinet. Manifest schema — every .cabinet field. ## File Structure URL: https://runcabinet.com/reference/file-structure/ File Structure Common cabinet paths: | Path | Purpose | | | | | .cabinet | Cabinet manifest | | index.md | Entry page | | .agents/ | Agent personas and memory | | .jobs/ | Scheduled job definitions | | .cabinet state/ | Runtime state managed by Cabinet | Do not publish hidden runtime folders to public websites. ## Job schema URL: https://runcabinet.com/reference/job-schema/ .jobs/ .yaml schema Routines are YAML files in .jobs/ . The filename becomes the routine slug. For the conceptual story see Routines. This page is the field by field reference. Minimal valid job Every field Trigger | Field | Type | Required | Default | What it does | | | | | | | | schedule | cron string \| "manual" | yes | — | Standard 5 field cron , or "manual" for run on button. | | timezone | IANA tz | no | system | E.g., "America/New York" . | | enabled | boolean | no | true | Off without deleting. | | jitterMinutes | integer | no | 0 | Random delay added per run to avoid thundering herd on cron aligned beats. | Identity | Field | Type | Required | Default | What it does | | | | | | | | title | string | yes | — | Shown in the schedule UI and approval logs. | | description | string | no | "" | One line summary. | | tags | string | no | | Free form tags for filtering. | Execution | Field | Type | Required | Default | What it does | | | | | | | | ownerAgent | agent slug | yes | — | Which persona runs this routine. Inherits its tools and memory. | | prompt | string | yes | — | The instruction. Variables get interpolated (see below). | | model | string | no | agent's default | Override the agent's model for this routine. | | effort | "low" \| "medium" \| "high" | no | agent's default | Override reasoning effort. | | tools | string | no | agent's default | Allow list of tool names for this routine. | | requiresApproval | boolean | no | false | If true, the result queues for review before landing. | Budget | Field | Type | Required | Default | What it does | | | | | | | | budget.maxTokens | integer | no | inherits | Token cap per run. | | budget.maxCostUsd | number | no | inherits | Dollar cap per run. | Outputs | Field | Type | Required | Default | What it does | | | | | | | | outputs | array | no | | Hint Cabinet which files this routine writes. Powers link checking. | | outputs .path | path | yes | — | Path within the cabinet, with variables interpolated. | | outputs .kind | string | no | inferred | E.g., "page" , "data" , "asset" . | Dependencies | Field | Type | Required | Default | What it does | | | | | | | | reads | path | no | | Files the routine declares it'll read. Used for impact analysis. | | after | string | no | | Slugs of jobs that must complete first. | Variable interpolation Available in prompt , outputs .path , and any string field: | Variable | Expands to | | | | | $DATE | YYYY MM DD | | $TIME | HH:MM | | $YYYY WW | ISO week, e.g. 2026 W18 | | $WEEK | alias for $YYYY WW | | $MONTH | YYYY MM | | $AGENT | owner agent's slug | | $CABINET | current cabinet's id | | $RUN ID | unique id for this run, e.g. r 42a8 | Complete example Manual routines Set schedule: "manual" for a button driven routine. The body of the YAML is unchanged; the routine just doesn't fire on a clock. When you click Run in the UI, you can pass arguments which become available in the trigger context. Validation A bad job file fails at boot with exit code 6 and a precise error. Read on Routines (concept) — the conceptual story. Persona schema — the agent file format. Manifest schema — the cabinet level config. ## Manifest schema URL: https://runcabinet.com/reference/manifest-schema/ .cabinet — manifest schema Every cabinet folder has a .cabinet file at its root . It's the only file Cabinet requires . Without it, a folder is just a folder; with it, the folder becomes a cabinet that the app can open, the registry can install, and other cabinets can nest. Every field | Field | Type | Required | Default | What it does | | | | | | | | schemaVersion | integer | yes | — | Always 1 right now. Lets Cabinet evolve the schema without breaking old cabinets. | | id | string | yes | — | Slug used as the cabinet's stable identifier. a z0 9 + . | | name | string | yes | — | Display name. Shown in the sidebar header and in the registry. | | description | string | no | "" | One line summary. ≤80 chars — that's the registry card limit. | | kind | "root" \| "child" | yes | — | Root cabinets stand alone; child cabinets nest under another cabinet's folder. | | version | semver | no | "0.1.0" | Useful for templates published to cabinets.sh. | | entry | path | no | "index.md" | The page Cabinet opens when you click into the cabinet. | | icon | string | no | inherits | Path or URL to a square icon used in the sidebar and registry. | | tags | string | no | | Free form tags used for registry filtering. | | license | SPDX id | no | inherits | MIT , Apache 2.0 , etc. Shown on the registry page. | | author | object | no | — | {name, url, email} . Shown on the registry page. | | providers | object | no | — | Provider routing config. See BYOAI for the shape. | | dispatch | object | no | — | Cross department dispatch policy. See Org chart. | | approvals | object | no | — | Auto approval rules for low impact proposals. | Root vs. child A root cabinet is the top of a tree. It has its own .cabinet , lives directly in $CABINET DATA DIR , and shows up in cabinetai list . A child cabinet is a folder inside another cabinet that gets its own scope, agents, and settings. The child has its own .cabinet , and the parent treats it as a sub cabinet (it shows up nested in the sidebar). Provider routing example | Subkey | Purpose | | | | | defaults.lead / defaults.specialist | Default model per agent type. | | fallbacks | Per model fallback chain when the primary returns 429 or hits a budget cap. | | budgets.daily.maxCostUsd | Hard cap per cabinet per day. | | budgets.perTask.maxCostUsd | Hard cap per individual task. | | localOnly | If true, refuse any non local provider. | Dispatch policy example See Org chart & departments for the full story. Approvals example Anything outside policy queues for manual approval. There's no global "trust everything" toggle. Validation Cabinet validates the manifest at boot. cabinetai doctor re runs validation. A bad manifest exits with code 6 and a precise field level error. Read on Persona schema — the agent file format. Job schema — the routine YAML format. Skill schema — the SKILL.md format. File structure — what else lives in a cabinet folder. ## Persona schema URL: https://runcabinet.com/reference/persona-schema/ persona.md schema A persona is a markdown file at .agents/<slug>/persona.md . The frontmatter (between the two lines) is structured. The body is the agent's system prompt . For the conceptual story see Persona. This page is the field by field reference. Minimal valid persona Frontmatter fields Identity | Field | Type | Required | Default | What it does | | | | | | | | name | string | yes | — | Display name. Shown in mentions, sidebar, org chart. | | emoji | string | no | "🤖" | Single emoji or short string. The agent's avatar in compact lists. | | role | string | yes | — | One line subtitle. ≤3 words is the convention. | | type | "lead" \| "specialist" | yes | — | Leads can dispatch. Specialists do focused work. | Model & dispatch | Field | Type | Required | Default | What it does | | | | | | | | model | string | no | inherits | Provider+model. Examples: claude opus 4 8 , gpt 4.1 , gemini 2.5 pro , ollama/llama 3.3 70b . | | effort | "low" \| "medium" \| "high" | no | "medium" | Default reasoning effort for this agent. | | canDispatch | boolean | no | true for leads, false for specialists | Allow LAUNCH TASK / SCHEDULE JOB proposals. | | tools | string | no | inherits | Allow list of tool names. Empty = inherit cabinet defaults. | | visibility | "folder" \| "cabinet" \| "all" | no | "cabinet" | How far the agent can read. | Heartbeats | Field | Type | Required | Default | What it does | | | | | | | | heartbeats | array | no | | Recurring check ins. See subfields below. | | heartbeats .cron | cron string | yes | — | Standard 5 field cron expression. | | heartbeats .label | string | no | derived | Shown in the schedule UI. | | heartbeats .prompt | string | yes | — | Prompt the agent receives when this beat fires. | | heartbeats .model | string | no | persona's model | Override per heartbeat. | | heartbeats .effort | string | no | persona's effort | Override per heartbeat. | | heartbeats .enabled | boolean | no | true | Disable without removing. | Memory & skills | Field | Type | Required | Default | What it does | | | | | | | | memory | string \| object | no | "memory.md" | Path to the agent's memory file, relative to the persona folder. | | memory.maxLines | integer | no | 2000 | Soft cap before Cabinet suggests a memory compaction. | | skills | string | no | | Skill slugs to attach by default. See Skills. | Budget | Field | Type | Required | Default | What it does | | | | | | | | budget.daily.maxCostUsd | number | no | inherits | Hard cap per agent per day. | | budget.perRun.maxCostUsd | number | no | inherits | Hard cap per individual run. | | budget.perRun.maxTokens | integer | no | inherits | Token cap per run. | Display | Field | Type | Required | Default | What it does | | | | | | | | color | string | no | derived | Hex or token name. Used for sidebar dot and chat bubbles. | | order | integer | no | alpha | Lower numbers sort first in lists. | Body — the system prompt Everything after the closing is the system prompt the agent gets at the start of every run. Treat it like an onboarding doc: Who they are — title, scope, personality if any. What they own — folders, files, recurring outputs. What they should never do — forbidden tools, forbidden folders, escalation rules. How they hand off — when to dispatch, when to write, when to stay quiet. Use markdown freely. The whole body is sent verbatim. Shorter is usually better. Example: a complete lead Validation Bad fields fail at boot with a precise error and exit code 6 : Read on Persona (concept) — the conceptual story. Manifest schema — the cabinet level config. Job schema — for routines ( .jobs/<slug>.yaml ). Skill schema — for SKILL.md. ## Skill schema URL: https://runcabinet.com/reference/skill-schema/ SKILL.md schema A skill is a folder. SKILL.md is the manifest the agent reads. For the conceptual story (and the security model) see Skills. This page is the field by field reference. Folder shape Cabinet mounts the folder into the agent's run sandbox. Files outside the folder are inaccessible via the skill. Frontmatter fields Identity | Field | Type | Required | Default | What it does | | | | | | | | name | string | yes | — | Slug used for @ mentions and the picker. a z0 9 + . | | displayName | string | no | derived from name | Pretty name for the picker. | | description | string | yes | — | Hover card explanation. ≤140 chars is the convention. | | version | semver | no | "0.1.0" | For registry publishing. | | author | object | no | — | {name, url} . | | license | SPDX id | no | "MIT" | Shown on skills.sh. | Permissions | Field | Type | Required | Default | What it does | | | | | | | | allowed tools | string | yes | | Allow list . Only these tools fire while the skill is active. | | network | object | no | — | Network egress allow list. | | network.allow | string | no | | Hostname patterns the skill may fetch from, e.g. " .crunchbase.com" . | | filesystem | object | no | — | Filesystem read/write scope. | | filesystem.read | string | no | inherits agent | Glob patterns this skill may read. | | filesystem.write | string | no | inherits agent | Glob patterns this skill may write. | IO contract | Field | Type | Required | Default | What it does | | | | | | | | input schema | JSON schema fragment | no | — | Lets users invoke the skill with structured args (e.g. /competitor brief company=acme ). | | output schema | JSON schema fragment | no | — | Hints which paths the skill writes. Used for link checking and approvals. | | estimated cost usd | number | no | — | Average cost. Surfaced in the approval queue. | | estimated runtime s | integer | no | — | Average runtime in seconds. Surfaced in the run UI. | Discovery | Field | Type | Required | Default | What it does | | | | | | | | tags | string | no | | Free form tags for skills.sh filters. | | category | string | no | — | "research" , "writing" , "data" , etc. | | requiresProvider | string | no | — | If set, the skill won't load unless one of these providers is configured. | Common tool names The exact list ships with the app and grows. Common ones: | Tool name | What it can do | | | | | read file | Read a single file (subject to filesystem.read ). | | write file | Write or create a file (subject to filesystem.write ). | | list dir | List a directory's contents. | | web fetch | HTTP GET (subject to network.allow ). | | web search | Search the web through the configured backend. | | run script | Execute a script under scripts/ (per run user confirm). | | shell | Arbitrary shell command. Almost never grant this. | | llm call | Inner LLM call. Only needed for skills that call models themselves. | Body — what the agent reads Everything after the closing is what the agent sees when it picks up the skill. Treat it like a runbook: What this skill does in one sentence. How to run it — step by step, including which scripts to call. What inputs it expects. What outputs it produces and where. What to watch for — failure modes, edge cases, when not to use it. Keep it concise. Long preambles get diluted. Complete example Validation Skills are validated: At install time (security scan + schema check). At every run (allow list enforcement, network/filesystem scopes). At update time (re scan, re confirm any new allowed tools ). A skill that violates its own allow list at runtime is killed mid run with a clear error. Cabinet never escalates a skill's permissions silently. Read on Skills (concept) — the security model in plain English. Persona schema — how to attach skills to an agent. skills.sh ↗ — the public registry. ## Roadmap URL: https://runcabinet.com/roadmap/ Roadmap What's already shipping, what's in flight, what's planned next. Legend: 🟢 Shipped · 🔵 Improved · ⚪ Planned (not yet built) · 🔴 Removed/Breaking · 🟣 AI & Skills ✅ Already shipped The short version of the full changelog. Latest: v0.4.3 (April 2026). 🟢 Platforms & install 🟢 macOS native app (Electron) — Apple Silicon + Intel .dmg builds, hardened runtime entitlements 🟢 npx CLI — create cabinet , cabinetai create / run / doctor / update / uninstall 🟢 Linux support via npx 🟣 AI runtime & providers 🟣 8 BYOAI CLI providers — Claude, Codex, Gemini, OpenCode, Pi, +3 more 🟣 Skills system — installable agent skills (Anthropic format), /.cabinet/skills/ , registry page with live manifests, tiered trust 🟣 Multi provider runtime — shared runtime picker, effort sliders, dynamic listModels() , brand icons 🟢 Terminal mode — persistent shell panel, PTY adapters per provider, fullscreen toggle, session resume 🟢 Data & file types 🟢 Markdown editor — WYSIWYG + source mode, slash menu, wiki links, @ mentions, drag handles, heading anchors, embeds 🟢 First class viewers — PDF, CSV, Mermaid, code, images, video, audio, Office docs, embedded HTML apps 🟢 Notebook viewer — .ipynb cells, outputs, visualizations 🟢 Search palette — ⌘K / / 2 pane palette backed by daemon side FlexSearch 🟢 Clean path URLs — /room/ / mirror the file tree; stays free for section anchors; legacy hash links auto redirect 🟢 Agents & tasks 🟢 Agent page v2 — chat first, conversations rail, editable identity, 100 famous figure avatars, sub task delegation 🟢 Tasks Board v2 — drag and drop with undo, multi select + bulk delete, density toggle, lane collapse, agent/depth/trigger filters, activity feed 🟢 Composer & scheduling — unified Task / Routine / Heartbeat dialog, WhenChip with NL parsing, shared AgentPicker , drag paste pick attachments 🔵 Conversations — multi turn runs, live chat stream, per turn runtime + tokens 🟢 Onboarding, help & UX 🟢 Onboarding tour — 3 slide animated, blueprint home, staged data reveal, breadcrumb 🟢 Help section — deep dive cards per feature, Skills + API Keys demos, keyboard shortcuts 🟢 Sidebar redesign — Cabinet drawer with Data / Agents / Tasks tabs, drag reorder, OS file import, Recent Tasks 🟢 Themes — Cabinet (Paper), Windows 95, Windows XP, Matrix, Apple 🔵 Calendar — off window event chevrons, editable hours, density slider, deduped multi cabinet cron events 🟢 Trust & infrastructure 🟢 Telemetry & privacy — anonymous opt out, Privacy toggle, TELEMETRY.md 🟢 Calm legal flow — full screen card, server side acceptance, ToS + Privacy 🔵 MIT licensed — fully open source 🔵 Accessibility — P1/P2 audit pass, focus rings, aria labels, AT friendly task cards ⚪ Coming next Platforms ⚪ Windows native support (today: WSL2 only) ⚪ Linux / Ubuntu full polish — packaged .AppImage / .deb , system tray ⚪ iOS / Android companion apps (read only first, write later) More AI providers ⚪ Hermes (Nous Hermes / open weights via Ollama) ⚪ Llama / Mistral / Qwen — broader local model coverage ⚪ LM Studio integration ⚪ Direct Anthropic API (no CLI required) ⚪ Direct OpenAI API (no CLI required) ⚪ xAI Grok direct API Integrations ⚪ Slack — read channels, post summaries, agent DMs ⚪ Discord — community channel ingestion + posting ⚪ Gmail — inbox triage, draft replies, scheduled summaries ⚪ Google Workspace — Drive (sync), Calendar (events as tasks), Docs import/export ⚪ Image generation — FLUX, Gemini, Grok, DALL·E, local SD via the same provider adapter pattern ⚪ GitHub — PR review, issue triage, repo aware agents ⚪ Notion / Linear import bridges Collaboration ⚪ Teams collaboration — multi user cabinets, presence, comments, permissions ⚪ Cabinet Cloud (optional) — sync across machines, share a cabinet with a teammate (waitlist) ⚪ Shared agent libraries — publish a team's agents, install across cabinets Localization & accessibility ⚪ RTL support — Hebrew, Arabic, Persian, Urdu — right to left layout for sidebar, editor, and agent panels ⚪ Multi language UI — Spanish, French, German, Portuguese, Japanese, Chinese, more (community translated) ⚪ Localized agent personas — built in personas that speak the user's language by default ⚪ Translated docs & templates — public docs and starter cabinets in the top supported languages ⚪ Locale aware dates & numbers — calendar, schedule pickers, and reports respect system locale AI quality ⚪ Per agent memory consolidation — distill long histories into durable facts ⚪ Cross agent context — leads can read specialist transcripts without copy paste ⚪ Routine self tuning — agents propose schedule + prompt edits based on outcomes Knowledge base ⚪ Better nested cabinet docs + nav ⚪ Import / export workflows — Obsidian vault, Notion export, generic markdown trees ⚪ Migration guides between Cabinet versions ⚪ More example cabinets on cabinets.sh 🟣 Wishlist (not committed) Things we're thinking about, not promising: Local only mode that hides cloud providers entirely (already an opt in flag — make it a first class install) Voice mode for agents (TTS reports, voice dispatch) A read only public cabinet share link An MCP server so other apps can read your cabinet How this changes The roadmap moves with each release. Cabinet ships fast — see the changelog ↗ for what landed last week. Want to push something up the list? Open a discussion in the Discord. ## Showcase URL: https://runcabinet.com/showcase/ Showcase This page is a public safe demo of how Cabinet can feel when a knowledge base also has agents, tasks, routines, screenshots, and generated reports. The panels on this page are examples only. They do not run tasks, call models, access files, or expose private cabinet state. Demo surfaces Agents Workspace Tasks Board What to notice The docs are real static pages. The agents and tasks are playful examples of what a private Cabinet can contain. File examples show how documentation, media, reports, and task recipes can sit together. The public website stays SEO friendly and LLM friendly because every docs page is rendered as static HTML. ## Agents Workspace URL: https://runcabinet.com/showcase/agents/ Agents Workspace This is a read only public version of Cabinet's Agents workspace. It uses static sample agents to show the real product shape: team counts, the org chart action, agent cards, routine controls, heartbeats, and schedule previews. Nothing on this page can create agents, run models, edit personas, or read private state. ## Tasks Board URL: https://runcabinet.com/showcase/tasks/ Tasks Board This is a read only public version of Cabinet's task board. It shows the same work surface shape as the app: view controls, filters, trigger chips, lanes, cards, agent pills, and task metadata. The examples are intentionally public safe. Nothing on this page can launch, resume, reassign, delete, or schedule work. ## Cabinet Stories URL: https://runcabinet.com/stories/ Cabinet Stories How real people use Cabinet. These cards are illustrative examples for now — the page is wired to swap in real Discord, X, and GitHub quotes as they come in. Filter by the kind of work or the channel the story comes from. Have your own? Post on X with mycabinet , drop it in Discord , or open a PR against the stories file in this docs cabinet. Best stories get featured. What we look for A specific persona — "solo founder," "PhD candidate," "two person agency," not "professional." A specific outcome — what the cabinet does that you used to do by hand. A specific surface — agents, heartbeats, child cabinets, templates, BYOAI. Helps people picture which feature to try first. Read on Templates — the pre built cabinets behind most of these stories. Showcase — the live agents workspace and task board demos. Philosophy — the thesis under all of this. ## Templates URL: https://runcabinet.com/templates/ Template cabinets You don't have to build your AI team from scratch. cabinets.sh is a public registry of plug and play cabinets — each one is a complete folder with agents, jobs, knowledge, and connectors ready to run. Browse them at cabinets.sh . What's inside a template Every template is a real, working cabinet folder: You install it. Cabinet picks up the agents, the jobs, and the knowledge skeleton all at once. You're running in 30 seconds. Install in one command That clones the template into your data folder, runs Cabinet's first time setup for the cabinet, and asks you to confirm any heartbeats before they fire. If you only want one template from a monorepo: Featured templates | Template | What it does | Team | Get it | | | | | | | ship it solo | Full startup ops for a one person team — strategy, product, growth, support | CEO, CTO, Growth Lead, Support Rep | npx cabinets add cabinet app/ship it solo | | job hunt hq | Run your job search like a sales pipeline | Resume Tailor, Interview Coach, Networking Strategist, Offer Analyst | npx cabinets add cabinet app/job hunt hq | | reply to everyone | Email triage, drafting, follow up automation | Inbox Zero Strategist, Reply Drafter, Follow up Nagger | npx cabinets add cabinet app/reply to everyone | | saas startup | Marketing, product, ops cabinets for a small SaaS | PM, Marketer, Customer Success, QA | npx cabinets add cabinet app/saas startup | | wedding ops | Wedding planning as a project, with a team | Planner, Budget Hawk, Day of Coordinator | npx cabinets add cabinet app/wedding ops | | podcast machine | Podcast pipeline — research, scripts, show notes, social | Producer, Researcher, Show Notes Writer, Clip Strategist | npx cabinets add cabinet app/podcast machine | | open source maintainer | Issue triage, PR review prep, releases, community | Triage Lead, Docs Writer, Release Manager | npx cabinets add cabinet app/open source maintainer | | agency | Multi client agency ops with a child cabinet per client | Account Lead, Producer, Project Manager | npx cabinets add cabinet app/agency | Browse all 20+ templates on cabinets.sh ↗ Make it yours A template is a starting point, not a contract. Once installed, edit anything : 1. Open .agents/<agent>/persona.md . Change the model, the role, the heartbeats. 2. Open .jobs/<job>.yaml . Retime, retarget, disable, delete. 3. Move folders. Rename pages. Add child cabinets. Cabinet doesn't track "diff from upstream." Once it's in your data folder, it's yours . You can still pull updates from the template repo when they ship — it's just git pull from inside the cabinet folder. Publishing your own template Made something useful? Share it. That: 1. Strips out anything in .gitignore (your real client data, API keys, chat logs). 2. Generates a README.md at the cabinet root from the index. 3. Validates the persona.md and job.yaml schemas. 4. Opens a PR to the cabinets.sh registry repo with your folder. Tips for a template people will actually install: Tip — Name it like a noun, not a verb. wedding ops beats plan your wedding . People scan for what it is , not what it does. Tip — Ship example data, not real data. Replace your real CSV rows with synthetic ones. Make it obvious. Real users will fill in their own. Tip — Write a one line description in the .cabinet manifest. That's what shows in the registry list. Keep it ≤80 chars. What templates can't do They can't bring your API keys . You add those in Settings after installing. They can't bring your private connectors (Gmail, Calendar, etc). The template defines the shape ; you authorize per install. They can't auto fire heartbeats on first install. Cabinet asks you to confirm each one. Read on Philosophy: a team of teams — why templates compose well. Org chart & departments — the structure templates ship with. cabinets.sh ↗ — the registry itself.