This was a migration week. Last time I wrote about scaffolding nine brands from one template in an hour. This week the wave kept rolling: five more products moved onto the framework, and everything around it shipped too. The framework cut three releases, the agent workflow engine cut fifteen, and a new streaming tool got its first usable panel. Here is what got built and why I think it is cool.
Five more brands onto OMEGA
OMEGA is the framework I am building to run every product I own: one set of packages for the website, the backend, the desktop app, and the browser extension. This week Proxifly, Optiic, Soundgrail, Trusteroo, and StudyMonkey each got a fresh monorepo on it, and the ITW Creative Works site itself followed.
Every port is the same move, which is the whole point:
- The legacy Jekyll site becomes the web target.
- The legacy backend becomes the backend target.
- The browser extension, where the product has one, becomes an extension target.
- The old settings, spread across a dozen files per product, get translated into one
omega.json5.
The "how it works" detail a dev reader wants: the migration is a config conversion, not a rewrite. The framework packages already know how to render a site, serve an API, and build an extension. A brand supplies the facts (name, domain, plans, colors, which features are on) and the packages do the rest. Optiic was the fun one: its legacy clone had fallen fifteen blog posts behind, and the port caught them all up because the new site reads the same content source as the old one.
Mid-week I renamed apps/ to targets/ across every brand repo and aligned the config and test lanes with the current framework. Boring on its own, but it means every brand now has the same shape, so a fix in one is a fix in all.
The framework itself shipped 0.47, 0.48, and 0.49 in three "board-clear" waves, each one landing a batch of issues across the web, backend, manager, and client packages.
workkit: the board learned what "QA passed" means
workkit is the engine that runs my Claude Code sessions against GitHub issues. Issues are the single source of truth; the agents' job is to keep them true. It went from 0.44 to 0.50.5 this week.
The feature that mattered most is small and embarrassing in hindsight. An issue used to move from building to qa, and the ship step read from qa. That one column meant two different things: "waiting for Ian to check this" and "Ian checked it, ship it." Every ship run had to ask which was which.
Now there is a status:complete stage. qa means the check is pending. complete means the owner passed it, with a dated comment saying so. Ship reads only from complete. The question went away, and the board grew a second region for side pockets (ideas, parked work) so the pipeline column stays honest.
Two other pieces landed alongside it:
- A checkpoint skill. Before a long chat gets compacted, it applies the conversation to the board: every verdict, decision, and open question gets filed as a comment or a status flip on its issue. Nothing durable lives only in chat anymore.
- Rate-limit hardening in the tower. The live dashboard now reads the GitHub GraphQL rate limit the way GitHub actually sends it, names the reset time when it trips, pages the board sweep, and reads up to 1,000 issues per query. Both dashboards share the same sweep.
It also now cuts a GitHub release on every version bump and moved to the Functional Source License.
StreamForge: switchboard got a panel
New project from last week, first real progress this week. StreamForge is my attempt to turn long working sessions into edited video without living in a timeline editor. Switchboard is the control side: it shipped 0.4 and 0.5.
The panel now has key-based auth, a local backend, an OBS setup card, and a one-line chat. The relay underneath it uses a bare OBS key, keeps its API on loopback ports only, and tears down cleanly even when spammed. The end-to-end test runs under its own compose project so it cannot collide with a dev instance.
The part I like: the panel's pages are built on the same framework as the brand sites above. A tool I built for myself runs on the same packages as the products I sell. No public site yet; when the first output is watchable, that will be the post.
A content generator that makes videos
A private repo called automated-content-generator hit 0.2.0 with one large landing: a strategy system, a news pipeline, video assembly through Remotion, and voiceover through Edge TTS.
The shape: pick a strategy (which brand, which angle, which format), pull the week's news through the pipeline, assemble the segments as a Remotion composition (React components rendered to video), and voice the script with Edge TTS. It is early. But the pieces now connect end to end, which is the part that usually takes longest.
Small but satisfying
-
ultimate-jekyll-manager 1.9.33 changed the build template to a shallow checkout plus an orphan
gh-pagesdeploy. Every downstream site picked it up on its next build. - The streamer-mode VS Code extension hit 0.6.0 and replaced its webview lock screen with a click shield, which blocks input without repainting the editor.
- The blog pipeline published about seventy posts across fourteen product sites this week, all through the same admin flow.
Next week: more brands over the line, and hopefully the first watchable output from the video side. If you have migrated a portfolio of products onto one framework, I would like to hear which product fought you hardest. Comments open.
Cover photo by Chintan Vadgama on Unsplash.
Top comments (0)