| @@ -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> |
| 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 in | 7 | +<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 is | 32 | ## 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 remains | 34 | +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 to | 38 | - 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 fairly | 41 | - 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 in | 45 | 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 | ## Projects | 48 | ## Projects |
| 25 | | 49 | |
| 26 | -Everything starts from a **project** from idea to publication. Its folder | 50 | +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, grouped | 51 | +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 | ## Requirements | 95 | ## 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 thumbnails | 105 | - 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 stats | 107 | - Optional: a [ytwatch](https://ytwatch.hakanai.io) account for channel stats |
| 59 | | 108 | |
| 60 | ## Installation | 109 | ## Installation |
| 61 | | 110 | |
| 62 | ```powershell | 111 | ```powershell |
| | 112 | +git clone https://rickub.com/hlassiege/daryl.git |
| | 113 | +cd daryl |
| 63 | py -3.12 -m venv .venv | 114 | py -3.12 -m venv .venv |
| 64 | .venv\Scripts\pip install -r backend\requirements.txt | 115 | .venv\Scripts\pip install -r backend\requirements.txt |
| 65 | cd web; pnpm install | 116 | cd web; pnpm install |
| @@ -85,20 +136,24 @@ with `npx` (downloaded on first render, along with its Chrome). |
| 85 | ## External services | 136 | ## 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 your | 142 | **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 avoid | 143 | 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 follows | 144 | 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 user | 151 | +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 analyze | 155 | +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 YouTube | 158 | ## 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 consent | 166 | +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 to | 169 | 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 Windows | 189 | 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 | ## Architecture | 204 | ## Architecture |
| 138 | | 205 | |
| 139 | ``` | 206 | ``` |
| @@ -149,24 +216,30 @@ backend/studio/ |
| 149 | system.py ffmpeg, Windows dialogs | 216 | system.py ffmpeg, Windows dialogs |
| 150 | youtube_api.py YouTube account (OAuth) for publishing | 217 | youtube_api.py YouTube account (OAuth) for publishing |
| 151 | modules/ | 218 | 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 |
| 153 | youtube/ api.py · tasks.py · service.py | 220 | 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.py | 222 | 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 + Vite | 236 | web/ Vue 3 + Vite |
| 167 | src/pages/ home, new project / brief, library, settings, teleprompter | 237 | 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 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 | +``` |
| 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 | ## Contributing | 291 | ## Contributing |
| 213 | | 292 | |
| 214 | -Issues and pull requests are welcome, keeping in mind this is a personal tool (see above): I'll merge | 293 | +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, you | 294 | +[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 under | 295 | + |
| 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 | ## License | 311 | ## 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 other | 315 | 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). |