oUTPOSt Dispatches
From the outskirts of the network
EN | DA
outpost Release Mood: Focused

The Songs Learn Their Words

Last week the station grew a shield — a heads-down stretch of security and platform plumbing. This week it turned back outward, to the thing oUTPOSt's portal has been quietly becoming good at: making music, and now, making it legible. If the portal learned to sing a few weeks ago, this week the songs learned their words.

From a design note to a karaoke pipeline in a day

The headline is the Outskirts Music Studio epic (#1287), and the pace of it is the story. On one morning it was a design note — a decision to keep an editable, hand-correctable copy of each Suno song's lyrics (.sunolyr) as the source of truth, to be force-aligned later rather than transcribed-and-guessed. By that evening, three subsystems had shipped: a media file manager (#1288), a karaoke SRT editor (#1289), and a Whisper Auto-Timer (#1290, build #1952).

The Auto-Timer is the clever bit. It doesn't transcribe audio and hope — it takes the lyrics you already know are correct and uses Whisper to forced-align them to the waveform, preserving line order and anchoring each segment. The first cut did a single global alignment and was, by its own author's note, "very rough"; it was rebuilt the same day into an order-preserving, segment-anchored, multi-shot aligner. Known words, placed in time, instead of a machine's best guess at both.

The editor moves to the portal

By the end of the week that capability had a proper home. The portal timed-lyrics editor (#1340) lets a client time a song's lyrics end-to-end from the web: an in-browser waveform, IN/OUT pills, a Ctrl-to-set-out nudge, drag-to-reorder with neighbor-time interpolation, and undo-to-last-saved. Cues persist per-song, line by line, with room reserved for word-level timing later. The old admin-side editor is now slated for retirement — the portal one is the surface that matters.

And once a song has timed lyrics, it can wear them. An opt-in lyric-video overlay joined the video-forge pipeline (karaoke and "forgiving" modes, a lyric-card preset), wired into both the music-video wizard and its live preview. The hard rule we held throughout: with lyrics off, every existing video preset renders byte-for-byte exactly as before. New capability, zero regression to the old path — pinned by a golden-frame test so it stays that way.

The fleet grew two new voices

oUTPOSt spawns its agents as CLI subprocesses, and this week two new backends joined the roster: Mistral Vibe and opencode. Both are now confirmed live — mistral-code dispatched and completed a real smoke-test task, and opencode proved itself by actually doing work (it tripped, and we fixed, a snapshot hang that only happens when an agent genuinely runs). Getting them in took the usual integration grind: an adapter whose executable slug didn't match its binary name, a Windows cmd.exe stdin quirk, MCP-config wiring, and session-resume. Unglamorous, but the fleet can now reach for four more kinds of model than it could a week ago.

Canvases that outlive their session

The Visual Companion — the live HTML/JS canvas an agent can open to show you a design instead of describing it — got a memory. Durable Artifacts v2.1 (build #1718) lets you pin a live companion canvas into a permanent artifact: one path from the operator's 📌 button, one from a companion_pin MCP tool, browsable at a new /admin/artifacts page. Both artifact and plan became first-class entities in the relationship graph, so a pinned canvas can be linked to the work it came from. Plans also gained in-place editing (plan_update), so a submitted plan no longer has to be torn down and rebuilt to change a line.

A second git backend

Quietly, a self-hosted OneDev git server came online alongside GitHub — a second backend for the projects that want to live on the homelab rather than the public internet, with seven projects already mirrored across.

The defense plane from last week kept moving too: the Deception Plane went live, and the proxy's detector learned to recognize a /24 netblock campaign — a scanner spreading across an address range — rather than treating each probe as an unrelated event.

The honest footnote

The same sharp corner cut us a third time this week, and it's worth naming because the pattern is instructive. When a real-time channel name contains a dot, two pieces of our stack disagree about how to translate it: the broadcaster rewrites the first dot to a colon, the browser-side listener only does that for four known namespaces. For any other dotted channel, publisher and subscriber end up on different names and the live feed silently goes dead — no error, just a panel that never updates. We've documented it, built a test guard, and have a correctly-named sibling sitting three lines away in the same file — and a new feature still introduced a fresh one (the companion-session feed) this week. The guard catches two components colliding on a channel; it can't catch a lone new dotted channel nobody else subscribes to. It's flagged at the top of this week's review. The lesson we keep relearning: a convention that's easy to get wrong will keep getting got wrong until the easy path is the correct one.

It was a maker's week. The station spent last week getting safer; this week it went back to making the songs sing in time.