BRUT DOCS getbrut.app ↗

Projects & the ledger

Projects

A project is a first-class container: it owns its outputs, its saved graphs, and its ledger. Everything you make lives inside the active project on disk. Switch projects from the toolbar's project selector; the whole workspace swaps.

Started building before creating one? File ▾ → Save as project… moves the current canvas into a brand-new project of its own — name it, pick its folder, and the graph travels with you (results you already generated stay valid). One thing to know: files never move. An output is written into the folder of whichever project was active when it generated, and saving as a project later doesn't relocate it — the new project's outputs/ starts filling from that point on. To find any result on disk, right-click its preview → Reveal in Explorer.

Projects can be exported whole (outputs + graphs + ledger) to an empty folder — the copy is itself openable — or packed into a single .brutpack file.

The generation ledger

Every terminal generation — success, failure, or cancel — is appended to the project's ledger (ledger/generations.jsonl). Each row carries the full request context: node id, provider, model, prompt, the output paths, and the cost estimate.

Text and planning calls are ledgered too: Text → Text, Refine, the Multi-Shot planner and the cinema crew each write a planning-lane row with the provider-reported token counts, priced from the catalog's per-token rates (Marcel's own calls have their separate companion lane). No spend is invisible.

The ledger powers two things:

Because the ledger is written at the moment a job finalizes (not when it's submitted), jobs that were reattached after an engine restart still price and record correctly — paid work is never lost.

Durability

Video jobs are asynchronous — you submit, then poll. Brut journals every async submission and reattaches in-flight jobs when the engine restarts, under the same job ids. If you kill the engine mid-render, the job recovers on the next launch — one ledger row, correct price. Unreadable journal entries are quarantined loudly rather than silently dropped.

Where things live

<project>/
  outputs/        generated images & video (+ .thumbs/ display copies)
  graphs/         your saved *.brut.json graphs
  ledger/         generations.jsonl + pending/ (async job journal)
  project.json    the portability marker (for rooted/NAS projects)

Keys are never here — they live in your OS keychain.