Weekly chapter57
2026-W16 · ending April 19, 2026· April 2026 chapter ↗

Chasing Stability and Speed

Monday started with the mobile app. I fixed the chat flow so local Gemma 4 stops asking for an API key. That was a real annoyance for anyone testing locally, so clearing that path was the priority. I also ti…

38commits10systems6min read
Product capture

Unicorn Brigade — dashboard.

Monday started with the mobile app. I fixed the chat flow so local Gemma 4 stops asking for an API key. That was a real annoyance for anyone testing locally, so clearing that path was the priority. I also tidied up conversation management in the chat tab view, which had been a bit loose.

Then came the entitlements issue. XcodeGen was overwriting the entitlements file every build, which is the kind of silent sabotage that eats hours. I removed the XcodeGen entitlements block so the file stays intact. Clean, simple, finally done.

Before the mobile work settled, I also wrote up an MLX Swift plus Foundation Models integration prompt for the next session. Just a plan, but it gives the next round of work a clear target.

I removed the XcodeGen entitlements block so the file stays intact.

Over on majiks.online, I tackled the pre-launch security and UX fixes from the audit. Thirteen files across auth, tracks, webhooks, and layout. The auth routes got tightened up, the track API routes got cleaned out, and the Stripe webhook handler got some attention. I also polished the landing page, header, and footer for the launch-ready pass.

The usual rhythm of building, breaking something small, fixing it, and moving on.

What stuck with me from the day is the entitlements fix. That was the kind of bug that makes you want to throw the machine out the window, and the fix was three lines removed. Sometimes the hardest problems are the ones that fight you quietly.

The chat fix matters more for users, though. Local Gemma without an API key is what people want to test with, and watching it ask for credentials every time was getting old fast.

Four commits across two repos. Thin day on paper, but the kind of thin that still ships real things: a working chat, a stable build, and a site that is one step closer to not embarrassing itself on launch.

Tuesday brought the headline of the week, or at least the start of it. I spent the morning wrestling with the dependency chain and the environment setup until the transcriber stopped choking on its own inputs. The result is v1.0.4, and honestly, it feels like a real release now.

The core of the day was spent in the meeting-minutes repo. Shafen has been a finicky beast, refusing to cooperate with the PATH variable or timing out during downloads. The Python bridge was the main culprit. I dug into DependencyChecker and PythonBridge.swift to trace where the handoff between Swift and Python was breaking. It turns out the script bundling was also in a bad state. The transcribe_parakeet.py and transcribe_vibevoice.py scripts needed to be properly aligned with the build process. I spent a good chunk of time adjusting the Info.plist and the SetupWizardView to make sure the user actually sees a working configuration rather than a cryptic error code. Fixing Shafen's bugs was not glamorous. It was mostly staring at logs and realizing that the timeout was just a polite way of saying the script could not find the executable. Once I got the PATH correct and the scripts bundled properly, the transcriber started decoding audio without complaint.

The other half of the work was lighter but necessary. I updated magicunicorn.tech to v1.0.4 to keep the website in sync with the release. It was a simple version.json update, but consistency matters when you are shipping a tool. The release commit itself was a zero-line change because the work was already done in the fixes. Sometimes the release is just a stamp of approval on the chaos you just tamed.

Also today: I kept the version numbers in lockstep so nobody wonders why the docs say one thing and the binary says another.

There is a satisfaction in fixing a bug that has been haunting you for weeks. Shafen is no longer a puzzle. It is a tool. You run it, it transcribes, it works. That is the goal. The dependency hell was real, but it is behind me now. The PATH issues are resolved, the timeouts are gone, and the scripts are bundled correctly. The transcriber is faster and more reliable. I can finally stop worrying about whether the next user will hit a wall before they even start.

The work carried the meaning today. No announcements needed. The code speaks for itself. Shafen v1.0.4 is out, it is stable, and it does what it says on the tin.

Wednesday was a pivot. NO FIXES. I spun up majiks.kids by forking the existing majiks.online v5.5.0 codebase. It was a clean break, moving 197 files into a new structure to build something distinct from the start. The initial commit brought in the whole skeleton: Docker setups, CI workflows, config files, and the base application structure. It was a big lift just to get the lights on.

Once the skeleton was standing, the real work began on the frontend. I tackled Phase 1 of the kid-friendly experience. This was a massive refactor, touching 98 files across the entire app. I stripped out 20239 lines of legacy code and replaced them with 4247 lines of new, focused logic. The goal was to get the homepage, core pages, and key components working. I built out the authenticated library views, playlist editing, and the settings page. It was a heavy rewrite, but it was necessary to ensure the new kid-facing interface was stable and fast.

With the UI taking shape, I turned my attention to the backend. The API routes were a mess of TypeScript errors, especially around the webhooks and admin endpoints. I spent the bulk of the afternoon cleaning up the schema and fixing the routes. I touched 11 different files, including the user admin routes, playlist management, radio station next-track logic, and the Stripe webhook handler. The result was a zero-error TypeScript build. The API is now type-safe and ready to handle the data flowing from the new frontend. It was tedious, but satisfying to see those red squiggles disappear.

Meanwhile, over in the art studio, I ran into a small but annoying bug. The img2img feature was blocking source images because of overly strict path validation. It was a simple fix, but it was blocking progress. I updated the HTTP and RPC server files to relax the validation logic. It was a 25-line change that unblocked the entire image generation pipeline.

Also today: I updated the dependency lock files and seeded the database with initial tier data to support the new structure.

The day added up to a solid foundation. I have a new project forked, a clean TypeScript build, and a working UI skeleton. The plumbing is fixed, and the code is ready for the next phase of development.

Friday arrived with the headline being simple: I got the Meeting Minutes app to point to the right place, and I made sure the native client stopped panicking when that place was slow to update. It was a two-part fix, one for the web interface and one for the Swift backend, but they solved the same problem from different angles.

On the web side, I pushed the download links in magicunicorn.tech to version 1.0.4. This involved touching four files, mostly in the React frontend. The bulk of the change was in dist/index.html and the JSX pages for Apps and Meeting Minutes. I just needed to make sure the links were current. It was a small change, but it mattered. If the links are wrong, the tool is useless. I also updated the package lock file, which is just housekeeping, but it keeps the build stable.

The more interesting work happened in the meeting-minutes repo. The Update

Also in the frame

Real product captures — click any to enlarge.

meeting ops
majiks
majiks
07 / Activity

The week, in commits.

Daily velocity and the systems that carried the work.

Week beginning April 13, 2026.
Index

10 systems,
one week of work.

crisis-management-opsmagicunicorn.techmajiks-art-studiomajiks-music-mobilemajiks-music-studio-promajiks-screenmajiks.kidsmajiks.onlinemeeting-minutesunicorn-brigade