Dispatch 227
Week ↗

Local brains, voice, and a clean start

Monday in the build log. Six commits, one repo, and a lot of moving parts settling into place. I spent the day tightening the core experience of the app, focusing on what happens when you first open it, how…

Commits
6
Systems
1
Read
2min
Product capture

Majiks Studio — Sterling session.

Monday in the build log. Six commits, one repo, and a lot of moving parts settling into place. I spent the day tightening the core experience of the app, focusing on what happens when you first open it, how you talk to it, and where the thinking happens. The headline here is the onboarding overhaul and the new local model capabilities. Everything else supports that shift toward a more private, capable, and personal tool.

The onboarding changes were the biggest structural shift. I rewrote the initial flow to be cleaner and more direct. The new Local Models management screen lives in the profile tab, giving users immediate control over their on-device capabilities. This wasn't just a UI tweak; it was a rethinking of how we present the app's most important feature. The code touches three files in the profile section, smoothing out the transition from first launch to active use. It feels less like a tutorial and more like a setup., smoothing out the transition from first launch to active use. It feels less like a tutorial and more like a setup.

Voice interaction is the other major addition. I added the ability to talk to Majik directly, moving beyond text input. This involved significant changes to the audio pipeline and the chat interface. The voice manager got a substantial update to handle the new input streams, and the chat tab now supports voice interaction. It’s a natural extension of the product, making the assistant feel more present. The code grew by over 230 lines in the audio and chat modules to support this. It’s not just a button; it’s a new way to interact.

I rewrote the initial flow to be cleaner and more direct.

Under the hood, the local model support expanded significantly. I added Gemma 4 support for on-device inference. This required updates across the board, from the network service layer to the chat state and the create/publish flows. The local LLM service grew by nearly 372 lines to handle the new model formats and integration points. This is about keeping data private and reducing latency. The system prompt also got enriched to inject user preferences, making the local model more responsive to individual style. The chat state file saw updates to handle this new context injection.

There were smaller fixes and upgrades scattered throughout. The text-to-speech engine now defaults to premium neural voices when available, a small quality-of-life improvement that makes the audio output sound less robotic. The player UX got some attention, with fixes to the mini-player and now-playing views to ensure smooth transitions during playback. I also ran comprehensive extraction tests to ensure the data pipeline remains robust despite the other changes. The codebase is healthier, and the user experience is sharper.

Also today: updating the info plist for voice permissions and ensuring the local LLM service integrates cleanly with the existing chat architecture. The work is cohesive, touching every layer of the app from the UI down to the inference engine.

The day added up to a more capable and intimate app. You start it, you talk to it, and it thinks locally. That’s the direction we’re heading.

Also in the frame

Real product captures — click any to enlarge.

majiks
majiks
majiks