Add your logo and your clips. Get a finished, on-brand video. Everything else is automatic.
Project description
Scenecast
Add your logo and your clips. Get a finished, on-brand video. Everything else is automatic.
Scenecast reads your brand straight from your logo, reads the scenes in your own footage, writes your colours and your text onto the video, and encodes the finished file. It all happens on your own machine, and nothing is uploaded.
Status: early development. Phase 1 is the first working release. See the roadmap below.
Why it is different
- Two inputs, and that is all. A logo and a folder of clips. No timeline to build, no code to write, no spec to hand-author.
- Your brand, read from your logo. Scenecast pulls your colours out of the logo and applies them across the video, with text contrast checked so it always stays readable.
- It watches your footage. Scene detection finds every cut, and your text cards land on those cuts on their own.
- Yours, and private. It runs locally. Your media never leaves your machine, and the tool is built to stand up to hostile files.
- Looks right by default. Card timing and spacing follow a house style tuned for reading, so the result looks considered with no fiddling.
How it compares. Remotion turns React code into video: you write components. editly assembles a video from a JSON spec: you write the spec. Scenecast takes a logo and a folder of clips: you write nothing.
Quick start
scenecast auto ./logo.png ./clips
One command. Scenecast reads your brand from the logo, watches your footage (up to five minutes per clip), keeps the best moments and drops the dull ones, writes the on-screen story itself from what it sees, cuts with clean dissolves and a gentle push-in, places every line where the frame is calm, and renders a polished vertical film in your colours. Video-only, ready to post; sound is added in the TikTok or Reels editor.
Every choice is recorded beside the output in a story file: which moments were
kept, which were dropped and why, and every written line. Run again with
--seed 2 for a fresh take on the story, --length 40 for a longer film, or
--dry-run to read the plan before rendering anything.
Tell it what the film is for
Add a brief and research, and the story is written about your subject, with verified facts and their sources:
scenecast auto ./logo.png ./clips --brief "a short history of the Golden Gate Bridge" --research
scenecast auto ./logo.png ./clips --brief "an advert for our taco truck in Austin" --research
Research mode uses an AI service with web search (set ANTHROPIC_API_KEY
first; keys come from console.anthropic.com). It states only facts it
verified, records the source links beside the output, and always shows you
the story before rendering. Privacy stays intact: only your brief and a few
words describing the footage's look travel; the footage itself never leaves
your machine, and without --research the tool makes no connection at all.
Review, give feedback, get a v2
Every run saves an editable story draft beside the output. Three ways to shape it:
scenecast auto ./logo.png ./clips --review # approve or give feedback before rendering
scenecast auto ./logo.png ./clips --feedback "warmer hook, mention the market"
scenecast auto ./logo.png ./clips --story output.story-draft.json # your exact wording
In research mode your feedback goes to the writer and the story is revised.
Offline, feedback takes a fresh pass, and for exact wording you edit the
draft file and hand it back with --story. Edited lines are held to the same
readability and voice rules, so a change cannot break the look.
Prefer your own words? Write them in a config and use the crafted modes:
# 1. read your brand from your logo (writes theme.json)
scenecast brand ./logo.png
# 2. build the video from your config (writes output.mp4)
scenecast build ./scenecast.yaml
Two commands, a finished branded video, nothing uploaded anywhere.
Prefer to be walked through it? Run scenecast init for a short set of questions (orientation, audience, resolution, length), and it writes the config for you.
Cinematic film mode
Give it video clips and get a polished, vertical, video-only story film for TikTok, Reels, or Shorts. It cuts and grades your footage, reads the scenes, and lays elegant text and effects on top:
scenecast film ./scenecast.yaml # writes a cinematic MP4, no audio track
It reads a short hook, a few beats (each mapped to a scene, with an optional small label), and a one-line ending from your config, holds each line long enough to read, cross-dissolves between clips, and ends cleanly on your logo. The regal serif ships inside the tool, so the look is the same everywhere. Sound is added later in the social editor.
The commands
scenecast auto LOGO CLIPS # everything automatic: analyse, write, cut, render
scenecast init # answer a few questions, write a config
scenecast brand LOGO # read the palette from a logo, write theme.json
scenecast probe MEDIA_DIR # list what is in a media folder
scenecast build [CONFIG] # build a branded slideshow video
scenecast film [CONFIG] # cinematic film from your own copy
scenecast preview [CONFIG] # render a keyframe contact sheet to check first
Where a command takes a config and you do not give one, it looks for --config, then for ./scenecast.yaml. Add --dry-run to plan without rendering.
How it works
- Brand. Your logo goes in. Scenecast extracts a colour palette, picks readable text colours that pass a contrast check, and writes a
theme.jsonyou can hand-edit. - Media. Your photos and clips are validated, cleaned up, and fitted to your chosen shape (landscape, portrait, or square).
- Scenes. Scenecast samples each clip at an interval matched to its length, finds the cuts, and refines each one to the exact frame.
- Cards. Your text lines are placed on the scene changes, timed for comfortable reading, and never overlapping.
- Render. The whole thing is composed as an HTML timeline, captured frame by frame in a headless browser, and encoded to MP4 with ffmpeg. The render is reproducible and resumable.
Install
Requires Python 3.11 or newer, and ffmpeg (which includes ffprobe) on your machine. ffmpeg is the free video engine Scenecast uses to read your clips and write the finished MP4, so install it first: on macOS brew install ffmpeg, on Debian or Ubuntu sudo apt install ffmpeg.
pip install scenecast
python -m playwright install chromium # one-off, downloads the render browser
That gives you the scenecast command. A container image with the browser and ffmpeg pinned is planned. For working on the tool itself, see CONTRIBUTING.md.
Configuration
The minimum is a logo and a folder of clips. Everything else has a sensible default. A commented example lives in scenecast.example.yaml, and the full shape is defined in config.schema.json.
output:
orientation: "9:16" # 16:9 | 9:16 | 1:1 | 4:5
resolution: "1080p" # 720p | 1080p | 1440p | 2160p
fps: 30
brand:
logo: "./assets/logo.png"
media:
items:
- "./clips/opening.mov"
- "./photos/site-01.jpg"
- "./clips/flyover.mp4"
cards:
lines:
- { scene: 1, text: "First light over the site" }
- { scene: 3, text: "Six acres, cleared and ready" }
Security and privacy
Scenecast runs locally and sends nothing off your machine. It processes untrusted media and renders HTML, so it is built with a full threat model and a hardened default posture: safe command execution, a restricted headless browser with no network egress, strict media validation, path confinement, resource limits, and metadata stripping. The details are in SECURITY.md. To report a security issue, see the disclosure section there.
Roadmap
- Phase 1 (MVP): brand extraction with contrast gate, config wizard, media validation, scene detection with refinement, deterministic ordering with quality gates, scene-mapped text cards, the render pipeline, resumable rendering, silent-by-default output, and a preview contact sheet.
- Phase 2: heuristic "best bits" selection, optional supplied audio, more platform presets.
- Phase 3: learned aesthetic selection, optional auto-drafted card text (always human-reviewed), transcription and subtitles.
- Phase 4: an optional MCP server, shipped with its full security posture.
Full detail in PRD.md.
Licence
MIT. See LICENSE.
Built by RoomCare.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file scenecast-0.2.1.tar.gz.
File metadata
- Download URL: scenecast-0.2.1.tar.gz
- Upload date:
- Size: 255.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0450203aa07726c2b1f567908006abf6ff71e64b43658e594670f6fe053048b3
|
|
| MD5 |
5a4a5b6827e3d1756a3da8ff55599c2b
|
|
| BLAKE2b-256 |
f6ac8c6124acd3814d900e761be3e19d0fcb34b6546c9676a56801e25175cc27
|
Provenance
The following attestation bundles were made for scenecast-0.2.1.tar.gz:
Publisher:
release.yml on roomcareOS/scenecast
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
scenecast-0.2.1.tar.gz -
Subject digest:
0450203aa07726c2b1f567908006abf6ff71e64b43658e594670f6fe053048b3 - Sigstore transparency entry: 2183498907
- Sigstore integration time:
-
Permalink:
roomcareOS/scenecast@45e44491ea3803167d793171bfe84bd965e353ad -
Branch / Tag:
refs/tags/v.0.2.1 - Owner: https://github.com/roomcareOS
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@45e44491ea3803167d793171bfe84bd965e353ad -
Trigger Event:
release
-
Statement type:
File details
Details for the file scenecast-0.2.1-py3-none-any.whl.
File metadata
- Download URL: scenecast-0.2.1-py3-none-any.whl
- Upload date:
- Size: 224.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0e5507f9426360edc68a050932d0856516687a175f30d0e45cae0fc8f74e189c
|
|
| MD5 |
12838b3c262e844b492f5bfbc1aa29ad
|
|
| BLAKE2b-256 |
3d816d403f4f2b60407009714866b321a63bd6cdff7f9bcbcb0f99b5bdd85665
|
Provenance
The following attestation bundles were made for scenecast-0.2.1-py3-none-any.whl:
Publisher:
release.yml on roomcareOS/scenecast
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
scenecast-0.2.1-py3-none-any.whl -
Subject digest:
0e5507f9426360edc68a050932d0856516687a175f30d0e45cae0fc8f74e189c - Sigstore transparency entry: 2183499194
- Sigstore integration time:
-
Permalink:
roomcareOS/scenecast@45e44491ea3803167d793171bfe84bd965e353ad -
Branch / Tag:
refs/tags/v.0.2.1 - Owner: https://github.com/roomcareOS
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@45e44491ea3803167d793171bfe84bd965e353ad -
Trigger Event:
release
-
Statement type: