workspaces/{workspaceId}/. One workspace, one brand. Everything the platform knows about a brand lives in this tree, and everything you read through the brain surface is a file in it.
What each folder means for a client
You never write to this tree from a client. You read it, through two lenses:- The portal file index (
portal.listFiles) returns every key in the workspace, workspace-relative. - The brain surfaces return the keys that matter for rendering a published agent: feed covers and posters, item media, and the frozen file index.
projects/{slug}/output/ is the feed
Published content lives in the project’s output/ folder. A feed post’s key, poster, and playable all point at files under projects/{slug}/output/. This is the folder to watch if you are syncing media to your own storage.
Posters and playables
Every.comp gets a baked .comp.poster.jpg still. Video-producing comps additionally get a transcoded .mp4 in output/, which the feed surfaces as playable. If playable is empty, only the poster exists.
Brand data clients can use
config/design-tokens.json and config/brand.json are readable through the R2 proxy and are the cheapest way to theme your own UI in the brand’s palette and typography — the same tokens the platform’s own renders use.
Key scoping, restated
Stream either through
brain.streamR2File, which takes a workspace-relative key.
What the R2 proxy will serve
Only allowlisted prefixes are reachable through the brain’s R2 endpoint; anything else returns403:
projects/, workflows/, assets/, config/, meta/, wrapper/, knowledge/, import/, .meta/
That set covers everything an integrator needs. The platform’s internal machinery (databases, secrets, service-to-service planes) is not in this tree and not reachable from the client API at all — see Scope.
Writing to the tree
Clients never write. Content enters the tree through the platform itself: agents generate, publishing freezes a release, and thews CLI (used by the workspace owner and authorized tooling) syncs a local checkout. The supported client path for new content is: run it through an agent on the platform, then read it back from the feed — see Scope.