Under the hood

How a sentence becomes a film.

RasanAI Studio is a native Mac app. It doesn't make the film itself. It runs your own Claude Code or OpenAI Codex as the film's director, hands it a crew and an engine, and shows you the work at every step. This page follows one film through all of it, down to the files on your disk.

App
Swift 6, SwiftUI
Director
Your Claude Code or Codex
Engine
Node 22, bundled
Renderer
HyperFrames, GSAP, three.js
Media
FFmpeg
Server
None. Files only.
RasanAI Studio's start screen in dark mode: a sidebar with Films, All films, Needs review, Brands, Series, Inspiration and Queue; the steps Describe, Setup, Brief, Story, Look, Preview and Final across the toolbar; the seven crew characters standing on a prompt box that reads Describe your video, or paste a link; and a status bar reading Ready for a film, Claude Code, Fast pace.
Studio 0.19.4 beta 1. Everything below happens behind this one prompt box.

The big picture

Four layers, and files between them.

Studio, the director and the engine never call each other over a network. Each one reads and writes files in your project folder. That is why you can quit the app mid-film, and why a phone pager like Squeak can answer a call the same way Studio does.

Layer 1RasanAI Studio

The window you use. Every stage is a native SwiftUI screen: no web view, no embedded console. It keeps your film library, launches the director, shows what it is doing, and turns your clicks into answers.

  • Swift 6
  • SwiftUI
  • Sparkle 2.10
  • macOS 14+
  • Apple Silicon

Layer 2The director

Your own Claude Code or OpenAI Codex, signed in to your own plan, started headless in the project folder. It reads RasanAI's SKILL.md and directs: it plans the film, briefs the crew, and stops at the calls that are yours.

  • claude --print
  • codex exec
  • SKILL.md
  • 35 role briefs

Layer 3The engine

The RasanAI skill, copied inside the app with its own Node. Zero-dependency scripts that print JSON: research tools, the design desk's library, the music edit, the gates, the 3D runtime and the finish. HyperFrames renders the scenes; FFmpeg handles every sound and pixel after that.

  • Node 22
  • HyperFrames
  • GSAP 3.14
  • three.js r181
  • FFmpeg

Layer 4Your disk

One plain folder per film. The brief, the research, the three scripts, the chosen design system, the score, the scenes as HTML, every render and every decision with its reason. Nothing lives inside the app, so updates never touch your films.

  • DESIGN.md
  • motion.md
  • decisions.json
  • exports/

A film's life

Seven steps. Here is what runs under each.

These are the same seven dots you see across Studio's toolbar. Pick one to see what is on your screen, who on the crew is working, and what is written to disk.

Rasan, directorWaiting for an idea

A sentence, a link, or some footage.

You type what you want, paste a product URL, or drop in clips, a logo or a track. Studio creates the film's folder straight away and saves it as a draft. No agent has started yet, so a draft costs nothing.

Your partSay what the film is about. That is the only thing RasanAI ever requires.

UnderneathStudio only

  1. Studio makes ~/Documents/RasanAI/<film>/ with assets/, audio/, compositions/ and exports/.
  2. Files you drop in are copied in as managed copies. Your originals are never moved or changed.
  3. The film appears in the sidebar under Recent, with its status.
rasanai-project.jsonrasanai-brief.jsonassets/

How the app and the director talk

One file to read. One file to append to.

The director's state lives in session.json. Only the engine writes it, atomically, by writing a temporary file and renaming it. Studio only reads it. Answers go the other way, as one JSON line appended to actions.jsonl under a lock file.

  • Nothing is lost. An answer that hasn't been picked up yet is pending, not missing. Studio shows it as sent and never writes it twice.
  • Bad input stops at the door. A line with an unknown step, a bad id or over 1 MB is listed in rejected.json with the reason, and never reaches the director.
  • It is a published contract. The protocol is versioned ("schema": 1), so other apps can answer too. That is how Squeak lets you make a call from your phone.
.rasanai/run-<id>/actions.jsonlone line per answer
# Studio takes actions.lock, appends, releases
{"id": "st-8f2c",
 "ts": "2026-10-21T09:41:07Z",
 "step": "story",
 "type": "choose",
 "value": "bold",
 "note": "",
 "source": "studio"}

# the director, blocked on the call
$ node console.mjs wait
consumed st-8f2c  story · choose · bold
# → the Look desk starts

The crew, for real

Each character is a group of agents.

The faces in Studio stand for real jobs. Behind them are 35 role briefs. Each one is a separate agent with its own instructions, the files it must produce, and a check its work must pass before the director accepts it. The crew never talks to you directly.

Rasan

Rasan Director

Your Claude Code or Codex session. Plans the crew, accepts or rejects their work, and keeps every decision with its reason.

SKILL.md · crew.mjs · console.mjs

Tara

Tara Scout

Product, brand, screens and precedent researchers, a local code scout (with permission), and a research lead who merges their findings.

research/ · truth sheet

Kavi

Kavi Writer

Three script writers in parallel, a script editor, and a treatment writer for music videos.

story/ · story.mjs check

Chitra

Chitra Art director

A design researcher, three design-system designers, plus styleframe and frame designers for key frames.

design/ · DESIGN.md · design.mjs

Laya

Laya Motion director

Scores the whole film, then either one film builder or one animator per scene builds it, in 2D or real 3D.

motion/score.json · compositions/

Rasika

Rasika Critic

A concept critic, a structure critic, a film critic, and frame, move and A/B jurors. "Competent but safe" counts as a fail.

the gates · critic reports

Mala

Mala Editor

For a folder of footage. Each clip is measured and transcribed, then cut on word boundaries, with cards between clips and captions on top.

footage/ · Footage and Cut panels

The same crew on either model. crew.mjs brief rewrites each brief for the model that will run it. The role, the check and the bar stay the same. On Codex, where there is no sub-agent tool, the crew runs as parallel codex exec processes from the same prompt files, and the same checks accept their work.

The checks

Nothing ships on a hope.

Each gate is a script that reads the actual work, not the agent's description of it. A check that couldn't run is never reported as a pass.

Story

story.mjs check rejects the default arc, and any pitch that would work for any product.

Anti-slop

slop.mjs catches the tells in copy, look, motion, timing and sound, from "seamless" to glowing text to a whoosh on every cut.

Motion contract

obey.mjs opens every scene in headless Chrome and checks every GSAP tween against motion.md.

Fluency

motion-gate.mjs measures the draft frame by frame: motion in at least 75% of frames, no freeze over 0.8 s, and text that fits.

3D and sound

stage3d.mjs check: the same pixels at the same time, and never blank. sound.mjs check: −14 LUFS, no audible loop, no dead air.

node obey.mjs --project videos/tally-launchreal checker output
obey: violations — 2 tweens (0 exempt) in 1 file(s); 2 error(s)
  [ERROR] ease-outside-set compositions/frames/01-shoebox.html
      h1.headline "Tax season. Again." @0.20s 800ms ease=power4.out
      ease power4.out is not one of motion.md's eases
      fix: use ease: "expo.out"
  [ERROR] banned:fade-up-slide compositions/frames/01-shoebox.html
      h1.headline "Tax season. Again." @0.20s 800ms ease=power4.out
      fix: replace with one of motion.md's entrances

# after the repair pass
obey: clean — 8 tweens (0 exempt) in 1 file(s); 0 error(s)

Rendering

Scenes are web pages. Frames are exact.

Every scene is an HTML composition with one paused GSAP timeline. The renderer doesn't play the page; it seeks it to each frame's exact time and takes a picture. So the same time always gives the same pixels, on every render.

  1. 1 · ComposeHyperFrames HTMLOne composition per scene, in the film's DESIGN.md, timed by data- attributes.
  2. 2 · AnimateGSAP, three.js2D on GSAP 3.14. 3D on Rasan3D, a three.js r181 runtime clocked by the same timeline.
  3. 3 · CaptureHeadless ChromeEach frame is seeked and captured. The finish renders sub-frames and averages them for real motion blur.
  4. 4 · GradeOne look, every cutGrain, halation, vignette and an optional LUT, the same on every scene, so cuts never change texture.
  5. 5 · DeliverFFmpegEncodes the MP4 and mixes the edited music and effects to −14 LUFS, plus a poster and captions.
  • Real 3D, not a demo. Rasan3D averages several renders per frame for motion blur, depth of field and anti-aliasing. Simulations are a pure function of time, so a seek always lands on the same frame.
  • Every word on its note. For lyric videos, RasanMusic lights each word on its sung start, read as a function of time.
  • The cost, stated. Motion blur costs about 3× a normal render at 8 samples and 10 to 12× at 32. Drafts skip it. 3D frames with depth of field can take seconds each without a GPU.
  • Stepped looks stay sharp. A scene animated on twos or threes can opt out of the blur, so its steps stay hard.
~/Documents/RasanAI/a real film folder, trimmed
Tally launch film/
├─ rasanai-project.json   type, length, shape, status
├─ rasanai-brief.json     your sentence, sources, taste
├─ DESIGN.md              the chosen look
├─ assets/  audio/        managed copies of your files
├─ compositions/          the scenes, as HTML
├─ exports/               what you exported
└─ .rasanai/
   ├─ current             → the active run
   └─ run-<id>/
      ├─ session.json     the director's state
      ├─ actions.jsonl    your answers
      ├─ decisions.json   every call + reason
      ├─ research/  story/  design/  look/
      ├─ motion/score.json  motion.md
      ├─ music/  sound/  footage/
      ├─ animatic.json  render-final.json
      └─ director.log
Brands/<name>/DESIGN.md      reused across films

On your disk

A film is a folder you can open.

Studio's library is ~/Documents/RasanAI. Search, rename, archive and duplicate films in the app, or open the folder in Finder. Nothing is kept inside the app.

Every decision has a reason

decisions.json is what the Decisions drawer (⌥⌘D) shows: the story device, the look, the motion, the transitions and the music edit. Each one names the obvious option it passed over.

The look travels

The chosen system is a complete DESIGN.md: colours by role, real fonts, motion and camera. Any agent or design tool can build from it. Brands live in Brands/ and are reused across films.

Pick up where you left off

The run folder holds the whole state. Quit mid-film and the director resumes from it; there is no session to lose.

The stack

Everything it is built on.

Open source under MIT, in one repository. The app, the engine, the site and the release tooling all live together, and each release goes out through one script.

PartTechnologyWhat it does here
The Mac app
InterfaceSwift 6 · SwiftUIA native screen for every step and panel, with no web view. The logic lives in StudioCore, separate from the app target.
PlatformmacOS 14+ · Apple SiliconAd-hoc signed, not yet notarized by Apple, and not sandboxed, because it has to run your CLI tools.
UpdatesSparkle 2.10 · EdDSAChecks a signed appcast every hour. An update is installed only if its signature verifies.
FeedbackHeresayThe in-app Report button for telling us what broke.
The director
AgentClaude Code · OpenAI CodexYour own install and your own plan. Studio checks it is signed in and never handles your login.
Supervisordirector-driver.mjsOwns the process group: pause, resume, the loop guard, and the event log Studio reads.
InstructionsRasanAI skillSKILL.md plus 35 role briefs. The same skill runs in Claude Code on its own, with a browser console instead of Studio.
The engine
RuntimeNode 22 (bundled)Zero-dependency scripts that print JSON. Shipped inside the app, so you don't need Node installed.
CompositionHyperFramesTurns HTML scenes into video, frame by frame, in headless Chrome. Installed on first use.
2D motionGSAP 3.14Every tween has an explicit ease and is checked against the film's motion contract.
3Dthree.js r181 · Rasan3DA deterministic 3D runtime with a render graph, GLSL passes, DOM in 3D and keyable lens settings.
Sound and pictureFFmpeg · ffprobeMusic analysis and editing, footage measurement, the grade, loudness and the final encode. Installed on first use.
TypeGoogle Fonts · FontshareReal fonts for every design system, copied into the project.
The library (data, not code)
Design systems108Movements, studios, regional and period looks, and materials. The designers blend from these; you never pick from a list.
Motion64 entries · 10 personalitiesMotion and camera styles, each with eases, durations, holds and banned moves.
Story70 devicesNarrative devices the writers pick from what is true about your product.
Sound64 tracks · 190 effectsA catalogue for the music edit and a sound-effect index for things you can see happen.

What leaves your Mac

Local by design. Honest about the rest.

Studio has no account, no server and no open port. But making a film uses outside services, so here is where your data goes.

Stays on your Mac

Your film folders, your footage, the engine and its scripts, music analysis, every gate, and the render itself.

Goes to your AI provider

Your director sends prompts and project context to Anthropic or OpenAI, under your own account and their terms. Check your agent's permissions before sharing private material.

May use the web

Research reads public pages. Site capture, voice, music and fonts can use HyperFrames, Google Fonts or Fontshare. Updates are fetched from GitHub.

Where it stands

A community beta, and what that means.

We would rather tell you what hasn't been proven yet than let you find out halfway through a film.

Tested

The app itself

Updates, storage, the questions, playback and export have been tested locally on real Macs.

Being validated

Real-agent films

Generating a whole film through Studio with a real agent is still being validated across every film type and revision. Expect rough edges, and tell us what breaks.

Experimental

Presenter films

You on a green screen, keyed into worlds made for each beat. These have only been checked on synthetic footage, with no full run on a real shoot yet. The clip plays whole: it isn't trimmed.

Installing the app

First launch, step by step.

The beta is ad-hoc signed but not yet notarized by Apple, so macOS asks you to confirm the first time. Managed Macs may not allow it.

Download for Mac

Release notes · SHA-256 checksum · Update feed · Source and build instructions

  1. Drag RasanAI Studio into Applications before you open it, so updates can replace it.
  2. Right-click the app and choose Open, or use Open Anyway in System Settings → Privacy & Security.
  3. Install and sign in to Claude Code or Codex if you haven't already. Studio finds it and shows its sign-in status in Settings (⌘,).
  4. Choose Help → Prepare Rendering Tools. It installs FFmpeg and HyperFrames into ~/Library/Application Support/RasanAI/Tools. Node is already inside the app.
  5. Describe your first film. After that, signed updates arrive on their own.

Prefer the terminal?

The same engine, as a skill.

The engine inside Studio is the RasanAI skill for Claude Code. Install it on its own and type /rasanai. Your calls then open in a Director's Console in your browser, on 127.0.0.1 with a per-session token. It needs Node 20 or newer (it fetches a private copy if you have none), the HyperFrames skills, and FFmpeg.

Claude Code plugin

From inside Claude Code.

> /plugin marketplace add Sibhimanyu/rasanai
> /plugin install rasanai@rasanai

skills CLI

From your terminal.

$ npx skills add Sibhimanyu/rasanai --skill rasanai

One-line installer

Clones and links the skill.

$ curl -fsSL https://raw.githubusercontent.com/Sibhimanyu/rasanai/master/install.sh | bash
> /rasanai make a 45s launch film for https://tally.app

The skill updates itself when it loads. MIT licensed; the bundled GSAP stays under its own Standard License.