// DEVLOG

What's shipping

Reverse-chron pulse across every project on this site — pulled straight from each repo's io-page branch at build time.

  • First full song, start to finish

    Everything since the 26th landed here at once: arc planning, gain-staging, a mastering loop, and the orchestration wired through a real pipeline module, plus a README since this ha…

  • The day the actual pipeline got built (and broke, honestly)

    Long one. Built the real recursive generate→review→fix loop end to end: a model call emits a DSL plan for a leaf, it gets rendered, reviewed against three checks, and — if it fails…

  • Building the thing that decides "good"

    Spent the day on reference grounding: pin down a checkpoint, build a real fingerprint library, and freeze the node schema before letting anything else get built against a moving ta…

  • Started Deaf Composition

    The whole premise: an AI directs an album — concept, structure, arrangement, sound design — but never gets to hear what it made. It only sees measurements: render a section, extrac…

  • Making renders match a target voice

    Two phases here. Phase 0 was just filling in schema columns that existed but were never populated at ingest — lemma via WordNet, plus f0var and a rough spectral-tilt voice-quality …

  • Exporting straight into Reaper

    Added a /api/render/{id}/reaper endpoint that hands back a ready-to-run Lua ReaScript — drop it into Reaper and it imports the assembled WAV onto a new track, then adds a named tim…

  • Phonemes, real F0, undo, and not losing my mind to the mouse

    Three things landed together, all kind of in service of "make word selection actually good": Speaking rate was normalized by character count, which is bad for short function words …

  • Started Mouthpiece, a speech collage engine

    The idea: type text, get back a WAV of real people actually saying it — cut word by word from a corpus of real speech, not synthesized. It's for an album, and the "real clip only, …

  • Coming back after two years to modernize the whole thing

    Big gap since the last post — the extension just sat there working (mostly) for two years. Came back and, in one sitting with Cursor doing a lot of the typing, went from v2.1 to v3…

  • Making backups actually visible while they run

    Up to now the dashboard just said "Drive / Last backup / Protection" and gave you nothing while a backup was actually happening. Added a real progress bar and log stream — parse re…

  • Finally added tests and CI

    Same day as the dashboard work, different mood: 16 unit tests for the boring-but-load-bearing stuff (label sanitizing, repository path resolution, restic's retention-flag construct…

  • Started Aegis: a USB backup agent that doesn't trust anything

    The idea: plug in a specific USB drive, it auto-backs-up whatever you've configured, using restic underneath (encrypted, deduplicated, content-addressed) instead of rolling my own …

  • The day I fought semantic zoom until it worked

    Long day. Started reasonable — added a docker-compose test stack and an actual async test harness with real focus-graph tests, merged that as PR 1 (the repo's first one). Then spen…

  • Nodes vs implementations, and the first focused views

    Split the data model: nodes are now abstract concepts with separate "impl" rows underneath them, plus an implcontexts table for which implementations apply in which context. That s…

  • Viewport controls and finally dockerizing it

    Added path highlighting and proper viewport controls (pan/zoom that doesn't fight you), a reset for selection state, and cleaned up dismissing newly-added nodes. Then split the pag…

  • Started skilltree

    Wanted a graph explorer for skills/topics with actual prerequisite structure — a DAG, not a flat list. FastAPI + Postgres + Alembic on the backend, Cytoscape.js inside Next.js on t…

  • WorkManager was never going to give me exact timing

    Long gap since the last post — this is everything interesting since then, which is really one thing: I redid how reminders get scheduled. They were running on WorkManager, a OneTim…

  • Tried to get the watch talking to the phone

    Made a Wear OS module. It does not talk to the phone yet. Set up a WearableListenerService and a message client on the phone side to push intake updates over — Wearable.getNodeClie…

  • The widget took four tries

    Spent two weeks fighting the widget. First pass was a classic XML AppWidgetProvider — RemoteViews, the whole deal. Got it on the home screen, clicking it opened the app, fine. Then…

  • Started Kap

    I keep forgetting to drink water, so I'm building an app that nags me about it. Nothing clever yet — Room DB for logging intake, a top bar, a slideout nav, a home screen that's act…

  • Automating the data collection

    Been feeding the regression model more data by hand for months — bumped the degree to 3 at some point for a better fit, but CSV rows don't write themselves. Finally wrote extract.p…

  • Suggestion box

    Added a popup suggestion box with Tab-to-autofill — type the delimiter + a partial keyword and it shows matching entries, Tab completes the top one. Took two passes (closes 7) to g…

  • Instagram and WhatsApp, again

    A month later, back to the sites that never worked right. Switched the whole "what am I even editing" detection over to window.getSelection() instead of whatever I was doing before…

  • Popup rewrite and v1.10

    Redid the popup twice in a week — first restructuring the dictionary editor into key/value pairs with a delete button per entry, then a full CSS/HTML pass that (deliberately) looks…

  • Rewriting how the extension gets injected

    Switched from declaring content scripts in the manifest to injecting them from the background script instead. Sounds like a lateral move, but it's what makes per-site whitelist/bla…

  • A day of chasing caret position bugs

    The core problem on tricky sites (Instagram again) was that caretPos would come back undefined, and without it there's no reliable way to know what to delete/replace — you'd have t…

  • Started EmojiType

    Browser extension: type :smile:, get 😄. First commit message is basically a bug report I wrote to myself: "It works!!! Need to clean up the emoji names... For some reason it does …

  • Predicting the actual ticket codes, and it worked

    This is the part that made the whole thing real instead of just a convincing-looking mockup. Wrote a Python script (CodePrediction/regress.py) that takes real ticket-code samples f…

  • UI polish, and I still can't fix the keyboard

    Timestamps went from raw dates to actual relative labels — "today," "yesterday," "before that" — much more like a real message history. Fixed text wrapping that was breaking for so…

  • Closing out the first bug wave

    Fixed a batch of small stuff tracked as GitHub issues: the exit button that didn't actually exit, message timestamps that weren't computing correctly, a dropdown for changing which…

  • Started BeogradPlusPlus

    Belgrade's public transit switched to a ticketing system where your "ticket" is just a text message conversation with a specific number showing you bought one — nobody actually che…

press play — 5 tracks
0:000:00