{"id":51104353,"url":"https://github.com/minervarose/moonlit-showrunner","last_synced_at":"2026-06-24T13:01:50.459Z","repository":{"id":363906459,"uuid":"1264884813","full_name":"MinervaRose/moonlit-showrunner","owner":"MinervaRose","description":"AI-assisted short-film pipeline in Python and Streamlit: story package, storyboard, character reference cards, continuity-aware image prompts, animatic MP4, and optional Sora video generation.","archived":false,"fork":false,"pushed_at":"2026-06-10T20:50:43.000Z","size":12845,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-10T22:20:38.982Z","etag":null,"topics":["ai-pipeline","ai-video","ai-workflow","character-continuity","creative-coding","generative-ai","human-in-the-loop","image-generation","moviepy","openai","prompt-engineering","prototype","python","sora","storytelling","streamlit","structured-outputs","video-generation"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MinervaRose.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-10T09:09:13.000Z","updated_at":"2026-06-10T20:52:58.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/MinervaRose/moonlit-showrunner","commit_stats":null,"previous_names":["minervarose/moonlit-showrunner"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/MinervaRose/moonlit-showrunner","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MinervaRose%2Fmoonlit-showrunner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MinervaRose%2Fmoonlit-showrunner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MinervaRose%2Fmoonlit-showrunner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MinervaRose%2Fmoonlit-showrunner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MinervaRose","download_url":"https://codeload.github.com/MinervaRose/moonlit-showrunner/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MinervaRose%2Fmoonlit-showrunner/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34733256,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-24T02:00:07.484Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-pipeline","ai-video","ai-workflow","character-continuity","creative-coding","generative-ai","human-in-the-loop","image-generation","moviepy","openai","prompt-engineering","prototype","python","sora","storytelling","streamlit","structured-outputs","video-generation"],"created_at":"2026-06-24T13:01:47.278Z","updated_at":"2026-06-24T13:01:50.445Z","avatar_url":"https://github.com/MinervaRose.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Moonlit Showrunner\n\n![Python](https://img.shields.io/badge/Python-3.10%2B-blue)\n![Streamlit](https://img.shields.io/badge/Streamlit-App-red)\n![OpenAI](https://img.shields.io/badge/OpenAI-Text%20%2B%20Images%20%2B%20Video-412991)\n![MoviePy](https://img.shields.io/badge/MoviePy-Visual%20Animatic-orange)\n![Sora](https://img.shields.io/badge/Sora-Full%20Real%20Video-purple)\n![Status](https://img.shields.io/badge/status-v0.7.3%20kitten%20prototype-yellow)\n![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)\n\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.20633401.svg)](https://doi.org/10.5281/zenodo.20633401)\n\n**An AI-assisted short-drama pipeline from premise to character-locked visual animatic and optional Sora-generated video output.**\n\nMoonlit Showrunner turns a magical story premise into a structured short-drama production package, reusable character reference cards, continuity-aware scene prompts, generated images, a visual animatic MP4, and an optional full Sora-assisted video output.\n\nThe current version pivots the original tooth-fairy premise into a safer, more whimsical story about **Milo, a kitten who loses his first tooth**.\n\nIt currently generates:\n\n- story brief and logline\n- character cards\n- 6-scene script\n- storyboard\n- visual style bible\n- character continuity profiles\n- global continuity lock\n- shot-by-shot continuity memory\n- reusable character reference cards\n- generated still images for each shot\n- MP4 assembled from generated images or fallback scene cards\n- optional Sora clips per storyboard shot\n- optional concatenated full Sora video output\n\n\u003e **Current status:** v0.7.3 is a working kitten-centered, character-locking prototype. It generates a structured narrative production package, character reference cards, stylized scene images, a visual animatic MP4, and—when explicitly enabled—one Sora video clip per storyboard shot, concatenated into a full video output.\n\u003e\n\u003e The project remains a prototype: character consistency is improved through reference cards, continuity prompts, and shot-level memory, but it is not yet equivalent to a dedicated production animation pipeline. The Sora workflow is intentionally budget-gated and moderation-aware.\n\n---\n\n## Demo concept\n\nSample premise:\n\n\u003e A small kitten places his first lost tooth on a tiny moonlit cushion beside his bed basket, worried that growing up means losing a little piece of himself. At midnight, the tooth opens a glowing silver doorway into a hidden fairy archive where cherished keepsakes become stars. By morning, he finds a coin and a faint sparkle on the windowsill, while the viewer sees the tooth fairy slipping into the dawn.\n\n---\n\n## Generated Sora video output\n\nThe v0.7.x prototype can generate a full Sora-assisted video output from the structured story pipeline.\n\n[![Moonlit Showrunner generated Sora video output](assets/screenshots/image-9.png)](https://youtu.be/vknl0erAFn8)\n\n[Watch the generated video output on YouTube](https://youtu.be/vknl0erAFn8)\n\nThis video is the generated short-drama output from Moonlit Showrunner. It was produced from the project’s pipeline: story package, character continuity profiles, character reference cards, storyboard, visual prompts, generated scene assets, Sora video clips, and final MP4 assembly.\n\nIt is not a walkthrough of the app interface; it is the generated story output itself.\n\n\u003e Small production note: the fairy unexpectedly bumps her head on the window frame as she flies out. This was not planned, but it is genuinely hilarious. Apparently, Sora has a sense of humour.\n\n---\n\n## Screenshots\n\n### Main interface\n\nThe v0.7.x interface includes the full pipeline: story generation, character reference-card generation, scene-image generation, animatic assembly, and optional full Sora video generation.\n\n![Moonlit Showrunner main interface](assets/screenshots/image-1.png)\n\n### Story brief\n\n![Generated story brief](assets/screenshots/image-2.png)\n\n### Script\n\n![Generated script](assets/screenshots/image-3.png)\n\n### Storyboard\n\n![Generated storyboard](assets/screenshots/image-4.png)\n\n### Continuity bible\n\nThe continuity bible stores stable identity details, character constraints, shot-level continuity notes, and consistency risks.\n\n![Character continuity bible](assets/screenshots/image-5.png)\n\n### Continuity report\n\n![Continuity report](assets/screenshots/image-6.png)\n\n### Character reference cards\n\nCharacter reference cards are generated before scene images and reused as identity anchors for stronger visual consistency.\n\n![Generated character reference cards for Milo and the Tooth Fairy](assets/screenshots/image-7.png)\n\n### Visual animatic frame\n\nThe visual animatic remains the fast preview mode. It assembles generated images into MP4-ready frames with scene labels, captions, transitions, and audio notes.\n\n![Visual animatic frame](assets/screenshots/image-8.png)\n\n### Full Sora video output\n\n![Current full real Sora video](assets/screenshots/image-9.png)\n\n---\n\n## Pipeline evolution\n\nMoonlit Showrunner has evolved in stages:\n\n### v0.3 / v0.3.1 — Visual animatic prototype\n\nThe v0.3 line demonstrated the first complete creative pipeline:\n\n```text\nPremise\n→ structured story package\n→ script\n→ storyboard\n→ scene image prompts\n→ generated still images\n→ continuity report\n→ edit decision list\n→ visual animatic MP4 assembly\n```\n\nThis stage generated stylized still images and assembled them into a simple visual animatic using MoviePy. It did not generate true AI motion video clips.\n\n### v0.5 — Full Sora-assisted video prototype\n\nVersion 0.5 extended the pipeline with optional real video generation:\n\n```text\nPremise\n→ structured story package\n→ script\n→ storyboard\n→ scene image prompts\n→ generated still images\n→ visual animatic MP4\n→ optional Sora clip per storyboard shot\n→ concatenated full video output\n```\n\nThe visual animatic remained the fast, reliable default workflow. The Sora step was optional and explicitly gated because video generation is slower and can incur higher API costs.\n\n### v0.7.x — Kitten-centered character-locking prototype\n\nThe current line adds character consistency and moderation-aware video prompting:\n\n```text\nPremise\n→ character-locking requirements\n→ structured story package\n→ character continuity profiles\n→ character reference cards\n→ scene image prompts using reference anchors\n→ generated scene images\n→ visual animatic MP4\n→ moderation-aware Sora prompts\n→ optional Sora clips per storyboard shot\n→ concatenated full video output\n```\n\nThe story also pivots from a human child protagonist to Milo the kitten, which is both more whimsical and more robust for video-generation safety.\n\n---\n\n## What changed in v0.7.x\n\n- Added a character-locking workflow with reusable character reference cards.\n- Added a dedicated app step to generate character reference cards before scene images.\n- Scene image generation attempts to reuse those reference cards as identity anchors.\n- Added user-editable character locking requirements in the sidebar.\n- Pivoted the default story concept from a little girl to **Milo the kitten**.\n- Updated the sample premise, sample story package, and default character-lock notes for Milo.\n- Kept the Tooth Fairy design: blue eyes, short white hair, very dainty, with a blue gown embroidered with tiny teeth.\n- Added moderation-aware Sora prompt sanitization.\n- Added graceful Streamlit handling for moderation blocks and billing-limit errors.\n- Full Sora generation skips existing `shot_XX_sora.mp4` files when possible, making partial reruns safer.\n\n---\n\n## Architecture\n\n```mermaid\nflowchart TD\n    A[User premise] --\u003e B[Streamlit interface]\n    B --\u003e C[Moonlit pipeline]\n\n    C --\u003e D[OpenAI text client]\n    D --\u003e E[Structured story JSON]\n\n    E --\u003e F[Story brief + characters]\n    E --\u003e G[Script + storyboard]\n    E --\u003e H[Visual style bible]\n    E --\u003e I[Character continuity profiles]\n    E --\u003e J[Shot continuity notes]\n    E --\u003e K[Edit decision list]\n\n    I --\u003e L[Character reference-card generation]\n    L --\u003e M[Reference assets]\n\n    H --\u003e N[Scene image prompts]\n    I --\u003e N\n    J --\u003e N\n    M --\u003e N\n\n    N --\u003e O[OpenAI image client]\n    O --\u003e P[Generated scene images]\n\n    P --\u003e Q[MoviePy / PIL assembler]\n    K --\u003e Q\n    Q --\u003e R[Visual animatic MP4]\n\n    I --\u003e S[Moderation-aware Sora prompt layer]\n    J --\u003e S\n    S --\u003e T[Optional Sora video client]\n    T --\u003e U[One real motion clip per shot]\n    U --\u003e V[Concatenated full Sora MP4]\n\n    E --\u003e W[Markdown + JSON exports]\n```\n\n---\n\n## Quick start on Windows PowerShell\n\n```powershell\npython -m venv .venv\n.venv\\Scripts\\python.exe -m pip install --upgrade pip\n.venv\\Scripts\\python.exe -m pip install -r requirements.txt\n```\n\nCreate `.streamlit\\secrets.toml` from the example file:\n\n```powershell\nCopy-Item .streamlit\\secrets.toml.example .streamlit\\secrets.toml\n```\n\nThen add your API key:\n\n```toml\nOPENAI_API_KEY = \"your-key-here\"\nOPENAI_MODEL = \"gpt-4.1-mini\"\nOPENAI_IMAGE_MODEL = \"gpt-image-1\"\nOPENAI_VIDEO_MODEL = \"sora-2\"\n```\n\nRun:\n\n```powershell\n.venv\\Scripts\\python.exe -m streamlit run app\\streamlit_app.py\n```\n\nIf no API key is provided, or if you want to test without spending credits, the app can run in **mock mode** using a built-in sample story package and placeholder images.\n\n---\n\n## How to use the app\n\n1. Enter or keep the sample premise.\n2. Review or edit the **Character locking requirements** in the sidebar.\n3. Click **Step 1 — Generate story package**.\n4. Review the generated tabs: story brief, script, storyboard, visual prompts, continuity bible, continuity report, and edit plan.\n5. Click **Step 2 — Generate character reference cards**.\n6. Click **Step 3 — Generate scene images**.\n7. Click **Step 4 — Assemble MP4 from current run**.\n8. Optional: enable both Sora safety toggles in the sidebar and click **Step 5 — Generate full real Sora video**.\n9. Download the JSON and Markdown exports from the **Exports** tab.\n\nEach run is saved into a timestamped folder under:\n\n```text\noutputs/runs/\n```\n\n---\n\n## Project structure\n\n```text\nmoonlit-showrunner/\n├── app/\n│   ├── streamlit_app.py\n│   ├── pipeline.py\n│   ├── openai_client.py\n│   ├── image_client.py\n│   ├── sora_client.py\n│   ├── character_locking.py\n│   ├── continuity.py\n│   ├── schemas.py\n│   ├── sample_data.py\n│   ├── agents/\n│   └── video/\n├── assets/\n│   └── screenshots/\n├── docs/\n├── outputs/\n│   └── runs/\n├── scripts/\n├── requirements.txt\n├── README.md\n└── LICENSE\n```\n\n---\n\n## Current limitations\n\n- Character consistency is improved through reference cards and continuity prompts, but it is not guaranteed like a rigged animation pipeline.\n- The Sora video workflow generates one clip per storyboard shot, then concatenates the clips into a full MP4; it is not yet a fully continuous single-shot film generation pipeline.\n- Sora may still introduce unexpected motion, visual drift, or accidental comedic behavior. In the current run, the fairy’s window-frame mishap is a feature only because it is charming.\n- The visual animatic MP4 remains useful as a fast preview, but it is assembled from still images, captions, overlays, and edit-plan timing rather than true motion video.\n- Audio is still represented as edit-plan guidance rather than a fully generated soundtrack, voiceover, or sound design layer.\n- The image and video generation steps do not yet include built-in review controls for regenerating one specific shot from inside the app.\n- The Sora workflow is intentionally gated with safety toggles because video generation can be slower and more expensive than text or image generation.\n\n---\n\n## Planned improvements\n\n- Add resume support for loading an existing run folder after restarting Streamlit.\n- Add review controls for regenerating a single character reference, scene image, or Sora video shot.\n- Add stronger character-consistency controls using selected reference images and optional visual reference assets.\n- Add selective prompt editing before image or video generation.\n- Improve the visual animatic with richer pan/zoom effects, transitions, caption styling, and pacing controls.\n- Add optional voiceover, soundtrack, or sound-design generation.\n- Add clearer run comparison tools for evaluating different versions of the same story.\n- Prepare a polished blog article / portfolio write-up explaining the architecture, design choices, limitations, and next steps.\n\n---\n\n## Why this exists\n\nShort-form narrative production usually requires several creative roles: writer, storyboard artist, visual director, continuity checker, editor, and production coordinator. Moonlit Showrunner explores how those roles can be represented as a transparent AI-assisted pipeline, with outputs that remain reviewable and editable by a human creator.\n\nThe project is intentionally honest about its current scope: it is a **working prototype**, not a finished AI film studio. Its purpose is to explore creative pipeline design, visual continuity, AI-assisted storytelling, and practical human-in-the-loop control.\n\n---\n\n## Project write-up\n\nI wrote a Medium article about the making of this project, including the design process, the Sora video workflow, the character-continuity problem, and the unexpectedly funny tooth-fairy window-frame moment:\n\n[The Kitten, the Tooth Fairy, and the Window Frame](https://medium.com/@sabrina.jorgenson/the-kitten-the-tooth-fairy-and-the-window-frame-57d1ddb3c9bb)\n\n---\n\n## License\n\nThis project is released under the MIT License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fminervarose%2Fmoonlit-showrunner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fminervarose%2Fmoonlit-showrunner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fminervarose%2Fmoonlit-showrunner/lists"}