final.mp4 out the other side. Ralphy wrote a dozen files along the way — most of them under workspace/projects/espresso-001/. This page walks through each one, who wrote it (agent vs CLI), and why it exists. After this you’ll be ready for the deeper architecture read.
The project directory
Every project lives atworkspace/projects/<id>/. For the espresso example:
workspace/ is gitignored — see Workspace. Safe to inspect, copy, branch, or wipe.
File by file
BRIEF.md — your intent
Written by the agent at intake. Captures the original one-liner, your answers to the 3-5 clarifying questions, and the chosen template. This is the contract between you and the agent for the project; if the render goes sideways, the brief tells you what was promised.
prompts.json — what was sent to the models
Written by the agent before each generation call. One entry per scene per modality (image, video, voiceover). The agent fills this in by adapting the template’s prompt vocabulary to your specific brief.
assets/ — the raw model outputs
Every file in assets/ is the output of a ralphy generate call. The CLI names them by slot: <scene-id>-<type>-<descriptor>.<ext>. Common slots:
scene-XX-bg-image.png— the still plate (image gen, e.g. gemini-3-pro-image-preview).scene-XX-vid.mp4— the animated clip (video gen, e.g. kling-v3.0-pro from the plate).scene-XX-vo.mp3— the voiceover line (ElevenLabs).music-bed.mp3— the music track (ElevenLabs Music API).
.scene-02-bg-image.v1.png is the original, scene-02-bg-image.png is the current pick. Per AGENTS.md invariant #13, Ralphy never overwrites a generation — every regen lands as a new version.
asset-manifest.json — the canonical scene list
Written and updated by the CLI as each scene completes. The renderer reads this file to know which assets to pull into the HyperFrames composition.
logs/generations.jsonl — every paid call
The cost-and-audit log. Append-only, one JSON object per line, one line per model call. The CLI writes this automatically every time ralphy generate runs.
A sample entry:
logs/user-prompts.jsonl — your chat turns
Every brief, intake answer, and follow-up you typed in chat is appended here by the agent via ralphy project log-prompt. It’s the conversational counterpart to generations.jsonl — together they let you replay the whole project end-to-end.
logs/user-assets.jsonl — your reference uploads
If you dropped any reference images or URLs into chat (e.g. “here’s a competitor’s TikTok”), the agent logged each one here via ralphy project log-asset. The actual files land under assets/refs/. For the espresso example without refs, this file is empty.
render/final.mp4 — the output
The CLI writes this via ralphy render <id>. HyperFrames opens workspace/projects/<id>/index.html headlessly, Puppeteer rasterizes each frame, ffmpeg muxes the mp4 with the audio tracks declared in the composition. The agent reads the render result and reports duration, file size, and total project spend back to you in chat.
Who wrote what
| Wrote it | Files |
|---|---|
| The agent (via chat + tool calls) | BRIEF.md, prompts.json, the contents of the chat itself |
The CLI (ralphy generate, ralphy project log-*, ralphy render) | assets/*, asset-manifest.json, logs/*.jsonl, render/final.mp4 |
| You (rarely, only if you dropped them in) | files under assets/refs/ |
prompts.json. If a cost looks high, the CLI logged it — grep generations.jsonl. If the render failed, ffmpeg or HyperFrames is the culprit — ralphy doctor.
Why the structure looks this way
- Append-only logs. Every paid call leaves a trace. You can audit cost, branch projects from a known-good point, and let the postmortem skill mine lessons learned. See Generation log.
- One project = one directory. No global state, no shared cache that surprises you.
rm -rf workspace/projects/espresso-001(orralphy project delete espresso-001) wipes the project cleanly. - Templates as starting points, not cages. The template seeded
prompts.jsonbut every prompt is editable. Ask the agent to “change scene-02 to wide-angle” andprompts.jsonupdates in place — the nextralphy generatereads the new prompt. - Manifest as the source of truth. The renderer doesn’t scan
assets/— it readsasset-manifest.json. That’s why promoting a regenerated variant is a manifest edit, not a file move.
Next
You know the file layout. Two good follow-ups:- Architecture — the full picture: how the agent, the CLI, HyperFrames, and the providers fit together.
- Talking to ralphy — phrasing patterns for daily use: regen, variant, batch, postmortem.
Related
- Workspace — the gitignored
workspace/directory - Projects — project ID conventions and the registry
- Generation log —
generations.jsonlschema and queries - AGENTS.md invariant #13 — the no-overwrite rule