LLM Cinema is an ASCII movie theater in the browser. At its heart is a small model called Cinema — a LoRA fine-tuned MiniCPM3-4B — that writes, draws, and directs original short films in ASCII, and plays them right in the page, streaming frame by frame. No video, no sound. Just imagination, one frame at a time.

From a single concept it writes a 9-beat, roughly 90-second film: it invents the story, draws every character in ASCII, picks the terrain (water shimmers, grass, snow, lava…), the weather and time of day, camera moves (pan / push / shake), and a feeling for each character — then stages and plays it on a little charcoal terminal.
Try it
- 🎬 Make a film — type any concept (or hit Surprise) and watch Cinema write, draw, and play an original film live.
- 🍿 Gallery — hand-picked films that replay instantly, even before the model wakes.
- 🔁 Replay the current film, or use ⛶ Fullscreen on mobile for a cinema view.
How it works
- Cinema (LoRA fine-tuned MiniCPM3-4B) emits a strict-JSON "movie script": title, logline, and shots (narration, cast, action, setting, camera, mood, dialogue).
- A from-scratch ASCII engine resolves each character (a sprite library plus a draw-on-demand model for anything new), composes the scene with z-ordered occlusion, textured floors and set dressing (sun/moon, clouds, stars, trees), then animates and subtitles it.
- A custom
gr.Serverfrontend streams frames over SSE onto a cinema-hall backdrop, with reactive lighting that mirrors the on-screen action. - Optionally, the director model can run entirely on your machine through the llama.cpp runtime (GGUF) — no cloud APIs.
The model and training pipeline stay private; this app is the demo.
Two ways to run it
The hosted Space generates live via a cloud endpoint so you can try it instantly in the browser. The project also ships a fully off-the-grid build that runs the 4B model locally through llama.cpp, which the author treats as the primary way to run it.
Off the grid (local)
The model serves locally via llama.cpp, exposing an OpenAI-compatible endpoint that the app points at — no cloud, no keys:
pip install -r requirements-local.txt
# serve the local GGUF model (OpenAI-compatible, llama.cpp) on :8000
MODEL=./models/cinema-q4_k_m.gguf python serve_llamacpp.py
# then, in another shell, point the app at it and open the cinema:
export CLAUDEMOVIES_LLM_URL=http://localhost:8000/v1
export CLAUDEMOVIES_LLM_KEY=local # any non-empty string; not checked
export CLAUDEMOVIES_LLM_MODEL=cinema
python server_app.py
Full setup (GGUF conversion and quantization, llama.cpp build) is in LOCAL_LLAMACPP.md. The Gallery plays even with no model running — its films are pre-written — so the page always shows something instantly.
Hosted demo (optional fallback)
The same app can point at any hosted OpenAI-compatible endpoint via Space secrets (CLAUDEMOVIES_LLM_URL / _MODEL / _KEY); nothing is committed to the repo. This is a convenience for the live link — the off-grid local run is the real thing.
Hackathon submission
LLM Cinema is entered in the Build Small Hackathon's An Adventure in Thousand Token Wood track — something delightful that wouldn't exist without AI. The model is load-bearing: it writes the story, draws every character, and directs the staging. Everything runs on the 4B MiniCPM3-4B, under the 32B cap and under the 4B Tiny Titan bar.
Bonus badges:
- Off-Brand — a fully custom
gr.Serverfrontend (cinema-hall backdrop, ASCII projected through the screen, reactive lighting). - Off the Grid — can optionally run fully local via llama.cpp, with no cloud APIs.
- Llama Champion — the model runs through the llama.cpp runtime (
serve_llamacpp.py). - Field Notes — see
FIELD_NOTES.md. - Open Trace — the agent's scrubbed, secret-free build trace:
traces/AGENT_TRACE.md.
Links
- Live app: conductorailabs-llm-cinema.hf.space
- Hugging Face Space: build-small-hackathon/llm-cinema
- Demo video: llm_cinema.mp4
- Social post: LinkedIn
Built by ConductorAILabs.
