hlassiege/darylpublic Fork
⑂ e80d1d3
Commits
⬇ Clone ▾
git clone https://git.rickub.com/hlassiege/daryl.git
git clone ssh://git@rickub.com/hlassiege/daryl.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Download ZIP

docs: update the readme for the open source release

hlassiege committed 2026-11-12T13:59:42+01:00 Browse files
e80d1d3 parent: 6a42fce
modified README.md +147 -53
@@ -1,15 +1,38 @@
1-# Studio
1+<p align="center">
2+ <img src="web/public/favicon.svg" alt="Daryl" width="96" height="96">
3+</p>
24
3-A local studio to produce YouTube videos (or whatever you want) from idea to publication: angle, titles, thumbnails,
4-script, shooting, rough cut, editing, shorts, rendering and upload, all in one interface.
5+<h1 align="center">Daryl</h1>
56
6-A lot of stuff runs on your machine (Whisper, ffmpeg, HyperFrames) but you can also plug in other tools (Gladia, Eleven Labs). The interface is available in
7-English and French.
7+<p align="center">
8+ A local studio to make YouTube videos, from the idea to the upload,<br>
9+ with Claude Code as a co-author and editing assistant.
10+</p>
11+
12+<p align="center">
13+ <a href="https://daryl.eventuallymaking.io">Website</a> ·
14+ <a href="https://rickub.com/hlassiege/daryl">Source code</a> ·
15+ <a href="https://github.com/hlassiege/daryl">GitHub mirror</a>
16+</p>
17+
18+<p align="center">
19+ <img src="media/screenshots/editing.png" alt="The editing step: preview, timeline with chapters, motion design, zooms, B-roll and music, and Daryl's chat" width="900">
20+</p>
21+
22+---
23+
24+Daryl takes a video through every step in one interface: angle, titles, thumbnails, script, shooting,
25+rough cut, storyboard, editing, shorts, render and upload. Daryl is also the name of the assistant
26+inside: it runs on your Claude Code subscription, proposes, and you decide.
27+
28+A lot runs on your machine (Whisper, ffmpeg, HyperFrames), and you can plug in other services
29+(ElevenLabs or Gladia for transcription, fal.ai for thumbnails). The interface is available in English
30+and French, and Daryl writes in the language of your channel.
831
932 ## A personal tool, shared as is
1033
11-I use this studio all the time for my own channel. I'm releasing it as open source, but it remains
12-a **personal tool**:
34+I use Daryl every week for [my own channel](https://www.youtube.com/@EventuallyCoding). I'm releasing it
35+as open source, but it remains a **personal tool**, maintained on a best-effort basis:
1336
1437 - You're welcome to use it, contribute to it, or fork it.
1538 - It is licensed under the **AGPL-3.0** (see [License](#license)): if you modify it and offer it to
@@ -17,49 +40,77 @@ a **personal tool**:
1740 same license. It can't be turned into a closed commercial product.
1841 - It will evolve in the direction **I** need. Feature requests may not land, but the code is fairly
1942 flexible overall, and it may give you ideas for your own workflow.
43+- The code comments are still mostly in French. They will move to English over time.
2044
2145 It is built on **Windows** and for a single user: no accounts, no remote server, all state lives in
22-`data/`. It should work on macOS and Linux too (?), but I don't test it there.
46+`data/`. It may work on macOS and Linux, but I don't test it there.
2347
2448 ## Projects
2549
26-Everything starts from a **project** from idea to publication. Its folder
27-(`data/projects/<id>/`) keeps everything it produces, and `project.json` its state. The steps, grouped
28-into Pre-production, Production, Post-production (Long-form and Shorts) and Publishing:
29-
30-| Step | What it does |
31-| --- |-------------------------------------------------------------------------------------------------------------|
32-| Angle | Brief (idea, direction, links, notes, length) → Daryl researches the topic and suggests 3 angles |
33-| Title | Daryl writes 30 titles from the chosen angle |
34-| Thumbnail | Variants for the A/B test, each tied to one of the kept titles: image generated by [fal.ai](https://fal.ai) |
35-| Script | Daryl can writes the script from the chosen angle; you edit it, with an assistant |
36-| Roasting | Roasting time: score, verdict, estimated retention and remarks to fix |
37-| Shoot | Shots, shooting setups and a teleprompter |
38-| Rough cut | Import footage; it is transcribed and silences and bad takes are cut. Export to DaVinci, Premiere or `.mp4` |
39-| Source video | The video to edit (reworked import or the rough cut) and its transcript |
40-| Editing | Timeline (zooms, B-roll, motion design, on-screen text, sounds, chapters), by hand or with Daryl. FCPXML export |
41-| Clips | Daryl suggests passages to turn into shorts |
42-| Editing (Shorts) | Captions and animated slides for each short |
43-| Render | Renders the long-form video and the shorts |
44-| Details | Title, description, tags, chapters and A/B test for each video |
45-| Upload | Uploads each video to YouTube once its checks pass |
46-
47-You can add motion and sound design in the editing chat. There is a **Library** (`data/library/`) to reuse your own resources (images, videos, sounds, templates) across projects.
50+Everything starts from a **project**. Its folder (`data/projects/<id>/`) keeps everything it
51+produces, and `project.json` its state. The steps, grouped into Pre-production, Shoot,
52+Post-production (Long-form and Shorts) and Publishing:
53+
54+| Step | What it does |
55+| --- | --- |
56+| Angle | From a brief (idea, direction, links, notes, length), Daryl researches the topic and suggests angles |
57+| Title | Daryl writes 30 titles from the chosen angle; you keep 2 or 3 for the A/B test |
58+| Thumbnail | One variant per kept title, generated with [fal.ai](https://fal.ai) from your references, or imported |
59+| Script | Write it yourself or let Daryl draft it from the angle, with versions and an assistant on the side |
60+| Roasting | Daryl reviews the script: score, verdict, estimated retention and remarks to fix |
61+| Shoot | Shots, shooting setups and a teleprompter for your phone |
62+| Rough cut | Import your footage: it is transcribed, silences and bad takes are cut. Export to DaVinci, Premiere or `.mp4` |
63+| Source video | The video to edit (the rough cut or a reworked import) and its transcript |
64+| Storyboard | Daryl reads the transcript and plans the motion design beats, anchored on the words; you review each one |
65+| Editing | Timeline with zooms, B-roll, motion design, on-screen text, sound design, music and chapters, by hand or with Daryl. FCPXML export |
66+| Clips | Daryl suggests passages to turn into shorts |
67+| Editing (Shorts) | Captions and animated slides for each short |
68+| Render | Renders the long-form video and the shorts |
69+| Details | Title, description, tags, chapters and A/B test for each video |
70+| Upload | Uploads each video to YouTube once its checks pass |
71+
72+Motion design is HTML animated with GSAP, rendered with [HyperFrames](https://github.com/heygen-com/hyperframes).
73+A **Library** (`data/library/`) keeps your own resources (images, videos, sounds, templates) to reuse
74+across projects.
75+
76+<p align="center">
77+ <img src="media/screenshots/storyboard.png" alt="The storyboard: motion design beats anchored on the transcript, with their place on screen" width="900">
78+</p>
79+
80+### Claude Code skills for editing
81+
82+Some editing jobs are done from a Claude Code session opened in this repository, with skills in
83+`.claude/skills/`:
84+
85+| Skill | What it does |
86+| --- | --- |
87+| `music-bed` | Scores the edit with background music from [Epidemic Sound](https://www.epidemicsound.com): one track per sequence, cut to cover it and ducked under the voice |
88+| `replace-aroll-take` | Replaces a stretch of the A-roll with a re-recorded take, and moves the B-roll, motions, sounds and zooms onto the new delivery |
89+| `snatch-cut` | Proposes a burst of close-ups with snap zooms and punchy sound design, with a preview render |
90+
91+`music-bed` needs an Epidemic Sound subscription and its MCP server (`.mcp.json`, with your key in
92+`EPIDEMIC_SOUND_API_KEY`). The `hyperframes-*`, `gsap`, `three` and `motion-graphics` skills come from
93+HyperFrames (see [Third-party notices](THIRD_PARTY_NOTICES.md)).
4894
4995 ## Requirements
5096
51-- Developed and tested on **Windows** only (native file dialogs, `FAL_KEY` read from the registry)
97+- **Windows** (native file dialogs, keys read from the Windows user environment)
5298 - **Python 3.12**
5399 - **Node.js** and **pnpm**
54100 - **ffmpeg** in the PATH (`winget install ffmpeg`)
55-- **[Claude Code](https://claude.com/claude-code)** installed and logged in (`claude auth login`). I suspect it can works with other LLMs, but I only test it with Claude Code.
101+- **[Claude Code](https://claude.com/claude-code)** installed and logged in (`claude auth login`). Other
102+ LLMs are not supported.
56103 - Optional: an NVIDIA GPU for Whisper (otherwise it runs on the CPU, slower)
104+- Optional: an [ElevenLabs](https://elevenlabs.io) or [Gladia](https://www.gladia.io) key for cloud transcription
57105 - Optional: a [fal.ai](https://fal.ai) key to generate thumbnails
106+- Optional: an [Epidemic Sound](https://www.epidemicsound.com) subscription for the `music-bed` skill
58107 - Optional: a [ytwatch](https://ytwatch.hakanai.io) account for channel stats
59108
60109 ## Installation
61110
62111 ```powershell
112+git clone https://rickub.com/hlassiege/daryl.git
113+cd daryl
63114 py -3.12 -m venv .venv
64115 .venv\Scripts\pip install -r backend\requirements.txt
65116 cd web; pnpm install
@@ -85,20 +136,24 @@ with `npx` (downloaded on first render, along with its Chrome).
85136 ## External services
86137
87138 **You are responsible for complying with the terms of service of every service this tool uses**
88-(YouTube, Anthropic / Claude, fal.ai, ytwatch, and the websites you download content from).
139+(YouTube, Anthropic / Claude, fal.ai, ElevenLabs, Gladia, Epidemic Sound, ytwatch, and the websites
140+you download content from).
89141
90142 **Claude Code.** The writing and editing steps run Claude Code headless (`claude -p`): it uses your
91143 logged-in subscription, not the API. `ANTHROPIC_API_KEY` is removed from its environment to avoid
92144 switching to API billing. Each session is isolated (no user `CLAUDE.md`, hooks or MCP) and follows
93145 the skills in the `skills/` folder, copied into each project.
94146
147+**Transcription.** Whisper runs locally by default. In Settings → Services, paste an ElevenLabs or
148+Gladia key to transcribe in the cloud instead.
149+
95150 **fal.ai.** The Thumbnail step generates its images with fal.ai: you need a key (fal.ai → API Keys)
96-in `FAL_KEY`. A `setx FAL_KEY "your-key"` is enough: the studio reads it again from the Windows user
151+in `FAL_KEY`. A `setx FAL_KEY "your-key"` is enough: Daryl reads it again from the Windows user
97152 environment, no restart needed. Each image is billed by fal.
98153
99154 **ytwatch.** In Settings, channel stats come from the [ytwatch](https://ytwatch.hakanai.io)
100-MCP, with a token pasted into the studio (stored in `data/ytwatch.json`). Daryl uses it to analyze
101-the channel.
155+MCP, with a token pasted into the app (stored in `data/ytwatch.json`). Daryl uses it to analyze
156+the channel. Everything else works without it.
102157
103158 ## Publishing to YouTube
104159
@@ -108,8 +163,8 @@ The Upload step uses the YouTube Data API v3, with your own OAuth client:
108163 "YouTube Data API v3" (APIs & Services → Library).
109164 2. OAuth consent screen: "External" type, add your address to the test users.
110165 3. Credentials → Create → OAuth client ID → "Desktop app"; download the JSON.
111-4. In the studio, Settings → YouTube account: drop this file, then "Connect YouTube" (the consent
112- screen opens in the browser).
166+4. In Daryl, Settings → Services → YouTube account: drop this file, then "Connect YouTube" (the consent screen opens
167+ in the browser).
113168
114169 API limits: until Google has audited the project, uploaded videos stay private (switch them to
115170 public in YouTube Studio); an upload costs 1,600 units of the 10,000 daily quota (about 6 videos);
@@ -134,6 +189,18 @@ On iPhone: open `https://<pc-name>.local:4400/rootCA.crt`, install the profile (
134189 Downloaded), then trust it (Settings → General → About → Certificate Trust Settings). The Windows
135190 firewall must allow port 4400 on the private network.
136191
192+## Motion design kits
193+
194+Daryl animates motion design with its own kit (`backend/studio/modules/animations/kit/`). You can
195+also import the cards of editing-os, a Claude Code + HyperFrames kit by another creator (MIT), into
196+the Library, Animations tab, if you have a copy of it:
197+
198+```powershell
199+..\.venv\Scripts\python scripts/import_editing_os.py <path\to\editing-os-starter>
200+```
201+
202+The import goes to `data/library/animations/editing-os/` and is never committed.
203+
137204 ## Architecture
138205
139206 ```
@@ -149,24 +216,30 @@ backend/studio/
149216 system.py ffmpeg, Windows dialogs
150217 youtube_api.py YouTube account (OAuth) for publishing
151218 modules/
152- transcript/ api.py · tasks.py · whisper.py · cues.py · service.py
219+ transcript/ api.py · tasks.py · whisper.py · cloud.py (ElevenLabs, Gladia) · cues.py · service.py
153220 youtube/ api.py · tasks.py · service.py
154221 animations/ api.py · tasks.py · service.py · captions.py (captions) · render.py (HyperFrames) · kit/
155222 shorts/ api.py · tasks.py · service.py · render.py
156- settings/ api.py · service.py (channel, ytwatch) · analysis.py (channel analysis by Claude)
223+ settings/ api.py · service.py (channel, services, ytwatch) · analysis.py (channel analysis by Claude)
157224 projects/ api.py · service.py (project.json) · runtime.py (jobs, imports, source video)
158- derush.py (rough cut, .xml) · prompts.py / tasks.py (Claude, copies, render)
225+ derush.py / autoderush.py (rough cut, Daryl's cuts, .xml)
226+ prompts.py / tasks.py (Claude, copies, render)
159227 library.py (resources, library) · migrate.py (migration of older data)
160228 script.py (block-based script) · roast.py (Roasting step: runs, remarks)
161229 thumbs.py / thumb_tasks.py (Thumbnail step)
162- assets.py / asset_tasks.py (adding media: downloads, images, screenshots)
163- montage.py / montage_tasks.py / timeline.py (editing, motions, FCPXML)
230+ assets.py / asset_tasks.py / media.py (adding media: downloads, images, screenshots)
231+ storyboard.py / storyboard_chat.py (motion design beats)
232+ montage.py / montage_tasks.py / timeline.py / transitions.py (editing, motions, FCPXML)
164233 render.py (final render of the long-form video, ffmpeg)
165234 publish.py (Details and Upload: metadata, checks, YouTube upload)
235+ cleanup.py (unused files of a project)
166236 web/ Vue 3 + Vite
167237 src/pages/ home, new project / brief, library, settings, teleprompter
168- src/project/ open project store, sidebar, step header, steps/ (one screen per step)
238+ src/project/ open project store, top bar, step header, steps/ (one screen per step)
239+ scripts/ screenshots.mjs (the screenshots of this README and the website)
169240 skills/ Claude skills copied into each project (script, titles, thumbnail)
241+.claude/skills/ Claude Code skills for editing sessions in this repository
242+site/ the website (static, deployed to Bunny CDN)
170243 data/ SQLite database, projects, library, media (ignored by git)
171244 ```
172245
@@ -200,21 +273,40 @@ Tasks on the same `queue` run one at a time (e.g. `gpu`); two different queues r
200273 | `TITLES_SKILL_DIR` | `skills/youtube-titles` |
201274 | `THUMB_SKILL_DIR` | `skills/youtube-thumbnail` |
202275 | `FAL_KEY` | fal.ai key (also read from the Windows user variables) |
276+| `EPIDEMIC_SOUND_API_KEY` | Epidemic Sound key, for the `music-bed` skill (`.mcp.json`) |
203277 | `STUDIO_NO_BROWSER` | unset (set it to `1` to not open the browser on launch) |
204278
205-## Third-party skills
279+## Screenshots and website
280+
281+The screenshots in `media/screenshots/` are taken from a running app, with your own projects (edit the
282+ids in `web/scripts/screenshots.mjs`):
283+
284+```powershell
285+cd web; pnpm screenshots
286+```
206287
207-`skills/youtube-scriptwriting` comes from [cdeistopened/skill-stack](https://github.com/cdeistopened/skill-stack),
208-© 2025 Wayne Sutton, under the MIT license (see [its LICENSE](skills/youtube-scriptwriting/LICENSE)).
209-`skills/youtube-titles` started as an adaptation of a skill from the
210-[co-writer-plugins](https://github.com/alexmcfarland-ai/co-writer-plugins) repository.
288+The website lives in `site/`: `node site/build.mjs` builds it into `site/dist/`. It is deployed to
289+Bunny CDN by `.rickub/workflows/deploy-site.yml` when `site/`, the screenshots or the logo change.
211290
212291 ## Contributing
213292
214-Issues and pull requests are welcome, keeping in mind this is a personal tool (see above): I'll merge
215-what fits how I work. For a bigger change, open an issue first. By submitting a contribution, you
216-agree that it is licensed under the AGPL-3.0 and that the maintainer may also distribute it under
217-other license terms.
293+The source of truth is [rickub.com/hlassiege/daryl](https://rickub.com/hlassiege/daryl); the
294+[GitHub repository](https://github.com/hlassiege/daryl) is a read-only mirror.
295+
296+Issues and pull requests are welcome on rickub, keeping in mind this is a personal tool (see above):
297+I'll merge what fits how I work. For a bigger change, open an issue first. By submitting a
298+contribution, you agree that it is licensed under the AGPL-3.0 and that the maintainer may also
299+distribute it under other license terms.
300+
301+## More from the author
302+
303+- [panoplie](https://panoplie.eventuallymaking.io): one catalog for the skills, rules and MCP servers of your coding agents.
304+- [Bloggrify](https://bloggrify.com): open source static blog generator built on Nuxt and Nuxt Content.
305+- [hakanai.io](https://hakanai.io): comments, analytics and newsletter for static blogs.
306+- [Writizzy](https://writizzy.com): blogging and newsletter platform.
307+- [Kula](https://kulamail.com): transactional and marketing email for developers and agents.
308+
309+All projects are listed on [eventuallymaking.io](https://eventuallymaking.io/p/about-me).
218310
219311 ## License
220312
@@ -222,3 +314,5 @@ Copyright © 2026 Hugo Lassiège
222314
223315 Licensed under the [GNU Affero General Public License v3.0](LICENSE) (AGPL-3.0-only). For any other
224316 licensing terms, contact me.
317+
318+Third-party skills and components keep their own licenses: see [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
@@ -1,15 +1,38 @@
1-# Studio1+<p align="center">
2+ <img src="web/public/favicon.svg" alt="Daryl" width="96" height="96">
3+</p>
2 4
3-A local studio to produce YouTube videos (or whatever you want) from idea to publication: angle, titles, thumbnails,5+<h1 align="center">Daryl</h1>
4-script, shooting, rough cut, editing, shorts, rendering and upload, all in one interface.
5 6
6-A lot of stuff runs on your machine (Whisper, ffmpeg, HyperFrames) but you can also plug in other tools (Gladia, Eleven Labs). The interface is available in7+<p align="center">
7-English and French.8+ A local studio to make YouTube videos, from the idea to the upload,<br>
9+ with Claude Code as a co-author and editing assistant.
10+</p>
11+
12+<p align="center">
13+ <a href="https://daryl.eventuallymaking.io">Website</a> ·
14+ <a href="https://rickub.com/hlassiege/daryl">Source code</a> ·
15+ <a href="https://github.com/hlassiege/daryl">GitHub mirror</a>
16+</p>
17+
18+<p align="center">
19+ <img src="media/screenshots/editing.png" alt="The editing step: preview, timeline with chapters, motion design, zooms, B-roll and music, and Daryl's chat" width="900">
20+</p>
21+
22+---
23+
24+Daryl takes a video through every step in one interface: angle, titles, thumbnails, script, shooting,
25+rough cut, storyboard, editing, shorts, render and upload. Daryl is also the name of the assistant
26+inside: it runs on your Claude Code subscription, proposes, and you decide.
27+
28+A lot runs on your machine (Whisper, ffmpeg, HyperFrames), and you can plug in other services
29+(ElevenLabs or Gladia for transcription, fal.ai for thumbnails). The interface is available in English
30+and French, and Daryl writes in the language of your channel.
8 31
9 ## A personal tool, shared as is32 ## A personal tool, shared as is
10 33
11-I use this studio all the time for my own channel. I'm releasing it as open source, but it remains34+I use Daryl every week for [my own channel](https://www.youtube.com/@EventuallyCoding). I'm releasing it
12-a **personal tool**:35+as open source, but it remains a **personal tool**, maintained on a best-effort basis:
13 36
14 - You're welcome to use it, contribute to it, or fork it.37 - You're welcome to use it, contribute to it, or fork it.
15 - It is licensed under the **AGPL-3.0** (see [License](#license)): if you modify it and offer it to38 - It is licensed under the **AGPL-3.0** (see [License](#license)): if you modify it and offer it to
@@ -17,49 +40,77 @@ a **personal tool**:
17 same license. It can't be turned into a closed commercial product.40 same license. It can't be turned into a closed commercial product.
18 - It will evolve in the direction **I** need. Feature requests may not land, but the code is fairly41 - It will evolve in the direction **I** need. Feature requests may not land, but the code is fairly
19 flexible overall, and it may give you ideas for your own workflow.42 flexible overall, and it may give you ideas for your own workflow.
43+- The code comments are still mostly in French. They will move to English over time.
20 44
21 It is built on **Windows** and for a single user: no accounts, no remote server, all state lives in45 It is built on **Windows** and for a single user: no accounts, no remote server, all state lives in
22-`data/`. It should work on macOS and Linux too (?), but I don't test it there.46+`data/`. It may work on macOS and Linux, but I don't test it there.
23 47
24 ## Projects48 ## Projects
25 49
26-Everything starts from a **project** from idea to publication. Its folder50+Everything starts from a **project**. Its folder (`data/projects/<id>/`) keeps everything it
27-(`data/projects/<id>/`) keeps everything it produces, and `project.json` its state. The steps, grouped51+produces, and `project.json` its state. The steps, grouped into Pre-production, Shoot,
28-into Pre-production, Production, Post-production (Long-form and Shorts) and Publishing:52+Post-production (Long-form and Shorts) and Publishing:
29-53+
30-| Step | What it does |54+| Step | What it does |
31-| --- |-------------------------------------------------------------------------------------------------------------|55+| --- | --- |
32-| Angle | Brief (idea, direction, links, notes, length) → Daryl researches the topic and suggests 3 angles |56+| Angle | From a brief (idea, direction, links, notes, length), Daryl researches the topic and suggests angles |
33-| Title | Daryl writes 30 titles from the chosen angle |57+| Title | Daryl writes 30 titles from the chosen angle; you keep 2 or 3 for the A/B test |
34-| Thumbnail | Variants for the A/B test, each tied to one of the kept titles: image generated by [fal.ai](https://fal.ai) |58+| Thumbnail | One variant per kept title, generated with [fal.ai](https://fal.ai) from your references, or imported |
35-| Script | Daryl can writes the script from the chosen angle; you edit it, with an assistant |59+| Script | Write it yourself or let Daryl draft it from the angle, with versions and an assistant on the side |
36-| Roasting | Roasting time: score, verdict, estimated retention and remarks to fix |60+| Roasting | Daryl reviews the script: score, verdict, estimated retention and remarks to fix |
37-| Shoot | Shots, shooting setups and a teleprompter |61+| Shoot | Shots, shooting setups and a teleprompter for your phone |
38-| Rough cut | Import footage; it is transcribed and silences and bad takes are cut. Export to DaVinci, Premiere or `.mp4` |62+| Rough cut | Import your footage: it is transcribed, silences and bad takes are cut. Export to DaVinci, Premiere or `.mp4` |
39-| Source video | The video to edit (reworked import or the rough cut) and its transcript |63+| Source video | The video to edit (the rough cut or a reworked import) and its transcript |
40-| Editing | Timeline (zooms, B-roll, motion design, on-screen text, sounds, chapters), by hand or with Daryl. FCPXML export |64+| Storyboard | Daryl reads the transcript and plans the motion design beats, anchored on the words; you review each one |
41-| Clips | Daryl suggests passages to turn into shorts |65+| Editing | Timeline with zooms, B-roll, motion design, on-screen text, sound design, music and chapters, by hand or with Daryl. FCPXML export |
42-| Editing (Shorts) | Captions and animated slides for each short |66+| Clips | Daryl suggests passages to turn into shorts |
43-| Render | Renders the long-form video and the shorts |67+| Editing (Shorts) | Captions and animated slides for each short |
44-| Details | Title, description, tags, chapters and A/B test for each video |68+| Render | Renders the long-form video and the shorts |
45-| Upload | Uploads each video to YouTube once its checks pass |69+| Details | Title, description, tags, chapters and A/B test for each video |
46-70+| Upload | Uploads each video to YouTube once its checks pass |
47-You can add motion and sound design in the editing chat. There is a **Library** (`data/library/`) to reuse your own resources (images, videos, sounds, templates) across projects.71+
72+Motion design is HTML animated with GSAP, rendered with [HyperFrames](https://github.com/heygen-com/hyperframes).
73+A **Library** (`data/library/`) keeps your own resources (images, videos, sounds, templates) to reuse
74+across projects.
75+
76+<p align="center">
77+ <img src="media/screenshots/storyboard.png" alt="The storyboard: motion design beats anchored on the transcript, with their place on screen" width="900">
78+</p>
79+
80+### Claude Code skills for editing
81+
82+Some editing jobs are done from a Claude Code session opened in this repository, with skills in
83+`.claude/skills/`:
84+
85+| Skill | What it does |
86+| --- | --- |
87+| `music-bed` | Scores the edit with background music from [Epidemic Sound](https://www.epidemicsound.com): one track per sequence, cut to cover it and ducked under the voice |
88+| `replace-aroll-take` | Replaces a stretch of the A-roll with a re-recorded take, and moves the B-roll, motions, sounds and zooms onto the new delivery |
89+| `snatch-cut` | Proposes a burst of close-ups with snap zooms and punchy sound design, with a preview render |
90+
91+`music-bed` needs an Epidemic Sound subscription and its MCP server (`.mcp.json`, with your key in
92+`EPIDEMIC_SOUND_API_KEY`). The `hyperframes-*`, `gsap`, `three` and `motion-graphics` skills come from
93+HyperFrames (see [Third-party notices](THIRD_PARTY_NOTICES.md)).
48 94
49 ## Requirements95 ## Requirements
50 96
51-- Developed and tested on **Windows** only (native file dialogs, `FAL_KEY` read from the registry)97+- **Windows** (native file dialogs, keys read from the Windows user environment)
52 - **Python 3.12**98 - **Python 3.12**
53 - **Node.js** and **pnpm**99 - **Node.js** and **pnpm**
54 - **ffmpeg** in the PATH (`winget install ffmpeg`)100 - **ffmpeg** in the PATH (`winget install ffmpeg`)
55-- **[Claude Code](https://claude.com/claude-code)** installed and logged in (`claude auth login`). I suspect it can works with other LLMs, but I only test it with Claude Code.101+- **[Claude Code](https://claude.com/claude-code)** installed and logged in (`claude auth login`). Other
102+ LLMs are not supported.
56 - Optional: an NVIDIA GPU for Whisper (otherwise it runs on the CPU, slower)103 - Optional: an NVIDIA GPU for Whisper (otherwise it runs on the CPU, slower)
104+- Optional: an [ElevenLabs](https://elevenlabs.io) or [Gladia](https://www.gladia.io) key for cloud transcription
57 - Optional: a [fal.ai](https://fal.ai) key to generate thumbnails105 - Optional: a [fal.ai](https://fal.ai) key to generate thumbnails
106+- Optional: an [Epidemic Sound](https://www.epidemicsound.com) subscription for the `music-bed` skill
58 - Optional: a [ytwatch](https://ytwatch.hakanai.io) account for channel stats107 - Optional: a [ytwatch](https://ytwatch.hakanai.io) account for channel stats
59 108
60 ## Installation109 ## Installation
61 110
62 ```powershell111 ```powershell
112+git clone https://rickub.com/hlassiege/daryl.git
113+cd daryl
63 py -3.12 -m venv .venv114 py -3.12 -m venv .venv
64 .venv\Scripts\pip install -r backend\requirements.txt115 .venv\Scripts\pip install -r backend\requirements.txt
65 cd web; pnpm install116 cd web; pnpm install
@@ -85,20 +136,24 @@ with `npx` (downloaded on first render, along with its Chrome).
85 ## External services136 ## External services
86 137
87 **You are responsible for complying with the terms of service of every service this tool uses**138 **You are responsible for complying with the terms of service of every service this tool uses**
88-(YouTube, Anthropic / Claude, fal.ai, ytwatch, and the websites you download content from).139+(YouTube, Anthropic / Claude, fal.ai, ElevenLabs, Gladia, Epidemic Sound, ytwatch, and the websites
140+you download content from).
89 141
90 **Claude Code.** The writing and editing steps run Claude Code headless (`claude -p`): it uses your142 **Claude Code.** The writing and editing steps run Claude Code headless (`claude -p`): it uses your
91 logged-in subscription, not the API. `ANTHROPIC_API_KEY` is removed from its environment to avoid143 logged-in subscription, not the API. `ANTHROPIC_API_KEY` is removed from its environment to avoid
92 switching to API billing. Each session is isolated (no user `CLAUDE.md`, hooks or MCP) and follows144 switching to API billing. Each session is isolated (no user `CLAUDE.md`, hooks or MCP) and follows
93 the skills in the `skills/` folder, copied into each project.145 the skills in the `skills/` folder, copied into each project.
94 146
147+**Transcription.** Whisper runs locally by default. In Settings → Services, paste an ElevenLabs or
148+Gladia key to transcribe in the cloud instead.
149+
95 **fal.ai.** The Thumbnail step generates its images with fal.ai: you need a key (fal.ai → API Keys)150 **fal.ai.** The Thumbnail step generates its images with fal.ai: you need a key (fal.ai → API Keys)
96-in `FAL_KEY`. A `setx FAL_KEY "your-key"` is enough: the studio reads it again from the Windows user151+in `FAL_KEY`. A `setx FAL_KEY "your-key"` is enough: Daryl reads it again from the Windows user
97 environment, no restart needed. Each image is billed by fal.152 environment, no restart needed. Each image is billed by fal.
98 153
99 **ytwatch.** In Settings, channel stats come from the [ytwatch](https://ytwatch.hakanai.io)154 **ytwatch.** In Settings, channel stats come from the [ytwatch](https://ytwatch.hakanai.io)
100-MCP, with a token pasted into the studio (stored in `data/ytwatch.json`). Daryl uses it to analyze155+MCP, with a token pasted into the app (stored in `data/ytwatch.json`). Daryl uses it to analyze
101-the channel.156+the channel. Everything else works without it.
102 157
103 ## Publishing to YouTube158 ## Publishing to YouTube
104 159
@@ -108,8 +163,8 @@ The Upload step uses the YouTube Data API v3, with your own OAuth client:
108 "YouTube Data API v3" (APIs & Services → Library).163 "YouTube Data API v3" (APIs & Services → Library).
109 2. OAuth consent screen: "External" type, add your address to the test users.164 2. OAuth consent screen: "External" type, add your address to the test users.
110 3. Credentials → Create → OAuth client ID → "Desktop app"; download the JSON.165 3. Credentials → Create → OAuth client ID → "Desktop app"; download the JSON.
111-4. In the studio, Settings → YouTube account: drop this file, then "Connect YouTube" (the consent166+4. In Daryl, Settings → Services → YouTube account: drop this file, then "Connect YouTube" (the consent screen opens
112- screen opens in the browser).167+ in the browser).
113 168
114 API limits: until Google has audited the project, uploaded videos stay private (switch them to169 API limits: until Google has audited the project, uploaded videos stay private (switch them to
115 public in YouTube Studio); an upload costs 1,600 units of the 10,000 daily quota (about 6 videos);170 public in YouTube Studio); an upload costs 1,600 units of the 10,000 daily quota (about 6 videos);
@@ -134,6 +189,18 @@ On iPhone: open `https://<pc-name>.local:4400/rootCA.crt`, install the profile (
134 Downloaded), then trust it (Settings → General → About → Certificate Trust Settings). The Windows189 Downloaded), then trust it (Settings → General → About → Certificate Trust Settings). The Windows
135 firewall must allow port 4400 on the private network.190 firewall must allow port 4400 on the private network.
136 191
192+## Motion design kits
193+
194+Daryl animates motion design with its own kit (`backend/studio/modules/animations/kit/`). You can
195+also import the cards of editing-os, a Claude Code + HyperFrames kit by another creator (MIT), into
196+the Library, Animations tab, if you have a copy of it:
197+
198+```powershell
199+..\.venv\Scripts\python scripts/import_editing_os.py <path\to\editing-os-starter>
200+```
201+
202+The import goes to `data/library/animations/editing-os/` and is never committed.
203+
137 ## Architecture204 ## Architecture
138 205
139 ```206 ```
@@ -149,24 +216,30 @@ backend/studio/
149 system.py ffmpeg, Windows dialogs216 system.py ffmpeg, Windows dialogs
150 youtube_api.py YouTube account (OAuth) for publishing217 youtube_api.py YouTube account (OAuth) for publishing
151 modules/218 modules/
152- transcript/ api.py · tasks.py · whisper.py · cues.py · service.py219+ transcript/ api.py · tasks.py · whisper.py · cloud.py (ElevenLabs, Gladia) · cues.py · service.py
153 youtube/ api.py · tasks.py · service.py220 youtube/ api.py · tasks.py · service.py
154 animations/ api.py · tasks.py · service.py · captions.py (captions) · render.py (HyperFrames) · kit/221 animations/ api.py · tasks.py · service.py · captions.py (captions) · render.py (HyperFrames) · kit/
155 shorts/ api.py · tasks.py · service.py · render.py222 shorts/ api.py · tasks.py · service.py · render.py
156- settings/ api.py · service.py (channel, ytwatch) · analysis.py (channel analysis by Claude)223+ settings/ api.py · service.py (channel, services, ytwatch) · analysis.py (channel analysis by Claude)
157 projects/ api.py · service.py (project.json) · runtime.py (jobs, imports, source video)224 projects/ api.py · service.py (project.json) · runtime.py (jobs, imports, source video)
158- derush.py (rough cut, .xml) · prompts.py / tasks.py (Claude, copies, render)225+ derush.py / autoderush.py (rough cut, Daryl's cuts, .xml)
226+ prompts.py / tasks.py (Claude, copies, render)
159 library.py (resources, library) · migrate.py (migration of older data)227 library.py (resources, library) · migrate.py (migration of older data)
160 script.py (block-based script) · roast.py (Roasting step: runs, remarks)228 script.py (block-based script) · roast.py (Roasting step: runs, remarks)
161 thumbs.py / thumb_tasks.py (Thumbnail step)229 thumbs.py / thumb_tasks.py (Thumbnail step)
162- assets.py / asset_tasks.py (adding media: downloads, images, screenshots)230+ assets.py / asset_tasks.py / media.py (adding media: downloads, images, screenshots)
163- montage.py / montage_tasks.py / timeline.py (editing, motions, FCPXML)231+ storyboard.py / storyboard_chat.py (motion design beats)
232+ montage.py / montage_tasks.py / timeline.py / transitions.py (editing, motions, FCPXML)
164 render.py (final render of the long-form video, ffmpeg)233 render.py (final render of the long-form video, ffmpeg)
165 publish.py (Details and Upload: metadata, checks, YouTube upload)234 publish.py (Details and Upload: metadata, checks, YouTube upload)
235+ cleanup.py (unused files of a project)
166 web/ Vue 3 + Vite236 web/ Vue 3 + Vite
167 src/pages/ home, new project / brief, library, settings, teleprompter237 src/pages/ home, new project / brief, library, settings, teleprompter
168- src/project/ open project store, sidebar, step header, steps/ (one screen per step)238+ src/project/ open project store, top bar, step header, steps/ (one screen per step)
239+ scripts/ screenshots.mjs (the screenshots of this README and the website)
169 skills/ Claude skills copied into each project (script, titles, thumbnail)240 skills/ Claude skills copied into each project (script, titles, thumbnail)
241+.claude/skills/ Claude Code skills for editing sessions in this repository
242+site/ the website (static, deployed to Bunny CDN)
170 data/ SQLite database, projects, library, media (ignored by git)243 data/ SQLite database, projects, library, media (ignored by git)
171 ```244 ```
172 245
@@ -200,21 +273,40 @@ Tasks on the same `queue` run one at a time (e.g. `gpu`); two different queues r
200 | `TITLES_SKILL_DIR` | `skills/youtube-titles` |273 | `TITLES_SKILL_DIR` | `skills/youtube-titles` |
201 | `THUMB_SKILL_DIR` | `skills/youtube-thumbnail` |274 | `THUMB_SKILL_DIR` | `skills/youtube-thumbnail` |
202 | `FAL_KEY` | fal.ai key (also read from the Windows user variables) |275 | `FAL_KEY` | fal.ai key (also read from the Windows user variables) |
276+| `EPIDEMIC_SOUND_API_KEY` | Epidemic Sound key, for the `music-bed` skill (`.mcp.json`) |
203 | `STUDIO_NO_BROWSER` | unset (set it to `1` to not open the browser on launch) |277 | `STUDIO_NO_BROWSER` | unset (set it to `1` to not open the browser on launch) |
204 278
205-## Third-party skills279+## Screenshots and website
280+
281+The screenshots in `media/screenshots/` are taken from a running app, with your own projects (edit the
282+ids in `web/scripts/screenshots.mjs`):
283+
284+```powershell
285+cd web; pnpm screenshots
286+```
206 287
207-`skills/youtube-scriptwriting` comes from [cdeistopened/skill-stack](https://github.com/cdeistopened/skill-stack),288+The website lives in `site/`: `node site/build.mjs` builds it into `site/dist/`. It is deployed to
208-© 2025 Wayne Sutton, under the MIT license (see [its LICENSE](skills/youtube-scriptwriting/LICENSE)).289+Bunny CDN by `.rickub/workflows/deploy-site.yml` when `site/`, the screenshots or the logo change.
209-`skills/youtube-titles` started as an adaptation of a skill from the
210-[co-writer-plugins](https://github.com/alexmcfarland-ai/co-writer-plugins) repository.
211 290
212 ## Contributing291 ## Contributing
213 292
214-Issues and pull requests are welcome, keeping in mind this is a personal tool (see above): I'll merge293+The source of truth is [rickub.com/hlassiege/daryl](https://rickub.com/hlassiege/daryl); the
215-what fits how I work. For a bigger change, open an issue first. By submitting a contribution, you294+[GitHub repository](https://github.com/hlassiege/daryl) is a read-only mirror.
216-agree that it is licensed under the AGPL-3.0 and that the maintainer may also distribute it under295+
217-other license terms.296+Issues and pull requests are welcome on rickub, keeping in mind this is a personal tool (see above):
297+I'll merge what fits how I work. For a bigger change, open an issue first. By submitting a
298+contribution, you agree that it is licensed under the AGPL-3.0 and that the maintainer may also
299+distribute it under other license terms.
300+
301+## More from the author
302+
303+- [panoplie](https://panoplie.eventuallymaking.io): one catalog for the skills, rules and MCP servers of your coding agents.
304+- [Bloggrify](https://bloggrify.com): open source static blog generator built on Nuxt and Nuxt Content.
305+- [hakanai.io](https://hakanai.io): comments, analytics and newsletter for static blogs.
306+- [Writizzy](https://writizzy.com): blogging and newsletter platform.
307+- [Kula](https://kulamail.com): transactional and marketing email for developers and agents.
308+
309+All projects are listed on [eventuallymaking.io](https://eventuallymaking.io/p/about-me).
218 310
219 ## License311 ## License
220 312
@@ -222,3 +314,5 @@ Copyright © 2026 Hugo Lassiège
222 314
223 Licensed under the [GNU Affero General Public License v3.0](LICENSE) (AGPL-3.0-only). For any other315 Licensed under the [GNU Affero General Public License v3.0](LICENSE) (AGPL-3.0-only). For any other
224 licensing terms, contact me.316 licensing terms, contact me.
317+
318+Third-party skills and components keep their own licenses: see [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).