# 2 · The Vault — the space as files > **This page is the canonical reference for everything on disk. If any other page disagrees with > this one, this one wins.** Format v2 (portals layout), current as of 2026-08. > > The product's one structural idea: the entire workspace — every canvas, note, drawing, image, > setting — is a folder of plain files on the user's own devices, called the **vault**. The files > *are* the data, not a copy of it. The app reads the same files you do. That is why you are a > first-class participant: **any agent that can read and write this folder is already integrated. > There is no API, no SDK, no server to call.** > > **Platform, plainly:** today Int.ai is an iPhone/iPad app. The computer side is just the synced > folder — no desktop app. iCloud carries the sync by default ([4 · Integration](4-integration.md) > covers alternatives). --- ## Hard rules Read these before writing anything. None is arbitrary: the vault has no server validating writes — these rules *are* the write contract, and each carries its mechanical reason so you can reason from it instead of memorizing it. - **ALWAYS include `status` on any node you write** — `"processed"` for your own. `status` is the capture-lifecycle field the whole inbox pattern runs on (schema below), so the app treats a node without one as incomplete and **silently drops it — never rendered, no error.** The number-one write failure. - **ALWAYS mark your writes `"source": "agent"`.** Two protections hang on this field: the watcher skips agent-sourced nodes, so your replies can never re-fire a trigger and cascade ([3 · The Loop](3-the-loop.md)) — and sweeps treat non-agent captures as the user's unprocessed thinking, so a mislabeled write becomes a "capture" your own system keeps re-handling. Set `color` explicitly with it: one consistent agent color is how the user knows your work on sight. - **ALWAYS name a new node/edge file by its `id`** — an **UPPERCASE** UUID (`8A21...`, never `8a21...`), filename `.json`. Uppercase is the app's own convention, and one casing everywhere keeps any id findable byte-for-byte with plain tools; filename-equals-id is what makes a fresh write collision-proof and addressable forever. - **NEVER read identity off a filename.** Filenames are human labels the app rewrites freely (a node file becomes its first line); identity lives inside the file (`canvas_id`, `id`, `note_id`) and never moves. Resolve by the id inside and a rename can never break you. - **NEVER reference media by URL.** The vault is self-contained on purpose — it must render on the phone with nothing fetched, and stay whole when copied, moved, or backed up. Media lives in `assets/` and is referenced by relative path. - **NEVER delete or rewrite the user's files** (nodes with `source: "user"`, their notes, their assets) unless the user's configuration explicitly says to. Your edits land directly in the source of truth — there is no undo gate protecting their thinking from you. - **After any write, verify:** re-read the file, confirm it parses, confirm the required fields match the schemas below. The app repairs *structure* on read; it does not backfill required fields — so an unverified bad write looks fine on your side and simply never appears. ## Vocabulary Six words, used identically across this whole guide: - **vault** — the folder; the whole workspace. - **portal** — one spatial canvas (the app's word for a canvas; `canvases/` is only the legacy folder name). One vault has many portals. - **node** — one card on a portal: text, media, or drawing. One node = one file. - **note** — one markdown document. The linear surface beside the spatial one. - **tag** — a literal `#word` typed inside a node's or note's text. **That's the entire storage mechanism — there is no `tags` field.** Meaning comes from configuration ([3 · The Loop](3-the-loop.md)). - **edge** — one connection between two nodes. ## Layout ``` IntAiVault/ ├── portals// # one portal; folder name = its display name │ ├── canvas.json # manifest — canvas_id inside is the identity │ ├── nodes/