Dispatch 181
Week ↗

The License Key That Saved the Build

Saturday morning started with the kind of calm that usually precedes a storm. I had fourteen commits to push for the v1.0.0 release, and the biggest one was hiding in plain sight. The day’s real headline was…

Commits
14
Systems
1
Read
2min
Product capture

Majiks Studio — effects.

Saturday morning started with the kind of calm that usually precedes a storm. I had fourteen commits to push for the v1.0.0 release, and the biggest one was hiding in plain sight. The day’s real headline wasn’t the new features or the documentation. It was a single line of text that changed everything: adding a production license key.

Before that, the app was technically built, but it was legally naked. I spent the first few hours hardening the core. The backend and Swift frontend needed to talk to each other about identity and permission. I updated the LicenseManager, the BackendViewModel, and the UpdateChecker. It was a small set of files, but it was the difference between a toy and a product. Once the key was in place, the build warnings stopped screaming. The tool-calling logic in the agent finally completed without tripping over its own feet. I fixed the warning in Package.swift and cleaned up the agent path. It was a subtle win, but it meant the app wouldn’t freeze when it tried to do something complex.

Then came the GPL trap. I had bundled ffmpeg because users needed it for decoding, but Apple’s notarization process has zero tolerance for GPL code in notarized binaries. The first notarization attempt failed. Hard. So I pivoted. I created a dual-download strategy. One build for the purists: Notarized, clean, no ffmpeg, but compliant with Apple’s strict rules. Another for the power users: Standard, with ffmpeg bundled, code-signed but not notarized. I wrote the scripts to build both, updated the DMG files, and set up the Git LFS attributes to handle the large binary files. It was a messy architectural compromise, but it gave users a choice.

Before that, the app was technically built, but it was legally naked.

The documentation grew alongside the code. I didn’t just want to ship the app; I wanted people to know how to build it from source if they wanted to. I added comprehensive site dev instructions, a quick start guide, and a deployment plan. I clarified the licensing in the README so there was no confusion about ownership. The E2E test plan was also finalized, ensuring that the new features didn’t break the old ones.

But the real victory was the bug fix that almost derailed the chat. I found a crash caused by missing keys in the regular chat path. It was a stupid oversight, a null pointer waiting to happen. I patched it in the backend and the Swift frontend. It was a four-line fix, but it kept the conversation flowing. I also fixed seven critical showstoppers that were blocking distribution, ranging from keychain storage issues to setup wizard glitches.

By the time I uploaded the organized tracks and the final DMGs, the repo was stable. The dual-download structure was in place. The license key was verified. The documentation was clear. It was a day of tightening screws, not adding new ones. The app was ready. The rest was just waiting for the world to download it.

Also in the frame

Real product captures — click any to enlarge.

majiks
majiks
majiks