The source of every narrated CrestApps video: the storyboards, slides, recorder scenes and YouTube metadata, and the skill that turns them into a video with one look and one voice.
The videos themselves are published on the CrestApps YouTube channel and embedded from there in the documentation. No video file is ever committed, here or in a product repository, so cloning a repository never downloads videos. Everything kept here is what's needed to make a video again, or to change how it appears on YouTube.
This table is generated from each video's video.json by python tools/youtube/youtube.py index.
| Path | What it is |
|---|---|
videos/<slug>/ |
One video: video.json (YouTube title, description, tags, chapters, links, id), storyboard.json (narration), slides.py, recorder/Scenes*.cs, durations.json, captions, and a README on how to record it again |
videos/*-walkthroughs/ |
Reels: the documentation's silent screencasts joined into one video per area, built by scripts/reel.py from reel.json |
.agents/skills/crestapps-video-producer/ |
The skill: the video specification, the narration, recording and assembly scripts, and the shared recorder |
branding/ |
The CrestApps logo and the Inter font every video uses |
tools/youtube/ |
Uploads a video, pushes video.json changes, computes chapters, and writes the table above |
.github/workflows/publish-video.yml |
Publishing a release uploads its video and opens the docs pull request |
.github/workflows/youtube-metadata.yml |
Pushes a changed video.json to YouTube when it is merged |
CONTRIBUTING.md |
How to submit a video, how it is published, and the one-time setup |
To submit a video, read CONTRIBUTING.md: what a pull request holds, how a video is published to YouTube, how the documentation pull request follows, and the one-time setup of the secrets.
Follow .agents/skills/crestapps-video-producer/SKILL.md. In short:
- Copy
videos/ai-profile-builder/tovideos/<slug>/and write the storyboard andvideo.json. - Narrate (
scripts/narrate.py), record the clips against a local site with fake data (the recorder), and assemble (scripts/assemble.py); thenyoutube.py chapters. - Check the video for private data, and merge its folder (never the MP4) to
main. python tools/youtube/youtube.py release <slug> --file <mp4>creates a draft release with the MP4 attached. Watch it there, then publish the release: the Publish video workflow uploads it to YouTube with its metadata, captions, thumbnail and playlists, records the YouTube id here, and opens a pull request in CrestApps.OrchardCore that links it on every docs page with<YouTube video="<slug>" />.
A video's versions are its releases (<slug>/v1, <slug>/v2, ...): a re-recording is a new release, and the previous
version on YouTube becomes unlisted. Changing a published video's title, description or chapters is an edit to its
video.json; merging it updates YouTube. See tools/youtube/README.md for the secrets these workflows need.
Python 3.11+ (pip install pillow pygments imageio-ffmpeg "edge-tts>=7.3.1", and tools/youtube/requirements.txt
to publish), the .NET 10 SDK for the recorder, and internet access for the voice.