Hadi Mulia

Projects

Deep dives into what I've built and why. Each one solved a real problem or proved a pattern.

01

Cherminal

Live

Native macOS chat + terminal for living with AI agents.

What it is

Native macOS app for living with AI agents. A three-pane shell: rooms on the left, a real Ghostty terminal in the center, context inspector on the right. Reads session files, process state, git state, and ports out of band, so the agents do not need to know Cherminal exists. Signed and notarized for distribution. v2 reworks the workspace into an infinite spatial canvas of agent terminals: movable, zoomable nodes, one canvas per project.

Why it matters

AI development is conversation-driven. Most agent surfaces are built for async multi-agent coordination and become too heavy for a sync single-agent workflow. Cherminal treats the conversation as the primitive instead of the file tree, and stays calm and fast by following one architectural rule: observe externally, never inject.

Stack

SwiftSwiftUIGhostty
cherminal.com
02

Constant

Live

One conversation. Any agent runtime. Codex ↔ Claude carry, local-first.

What it is

Local-first continuity tool for agent CLIs. `constant host` runs the active runtime inside a native PTY and lets you switch the live agent with a tmux-style prefix key. `constant carry` distills a session and writes it native to the next runtime; `pack` and `unpack` move whole sessions between machines. Ships as versioned GitHub releases with a Homebrew tap and docs at constant.sh, backed by a continuity eval benchmark that scores real Codex, Claude Code, opencode, and Gemini handoffs with partial credit instead of pass / fail.

Why it matters

Codex changes. Claude changes. The conversation stays constant. Different agent runtimes have different strengths, but I should not have to rebuild context every time the runtime changes. Continuity is treated as a first-class developer primitive rather than fake hidden memory.

Stack

RustNative PTYHomebrew
constant.sh
03

Burnrate

Live

macOS menu-bar advisor for Claude Code + Codex usage.

What it is

macOS menu bar + notch app that turns local usage history into a live advisor. Pressure gauges, pattern cards, personal usage stories. Answers "can I keep coding right now?" with a verdict, reason, forecast, live burn rate, and primary driver. Local Claude and Codex readers; usage windows, reset timestamps, context percentages, cache health, compaction signals.

Why it matters

AI usage is a real local resource. Most surfaces are dashboards-in-the-cloud or invasive. Burnrate is local-first, story-led, and treats the menu bar and notch as native product surfaces.

Stack

SwiftSwiftUIKeychain / OAuthHomebrew Cask
burnrate.fyi
04

Skillpack

Open source

Portable skills for coding agents. Host-agnostic.

What it is

Daily-driver skillpack for coding agents. Workbench (research-report, memory-scriber, devour, bedrock, gauntlet, scour, skill-distiller, skill-manager), trail-scriber, birdwatch, autoreview, plus video preproduction tools. Plugin verticals over flat skill sprawl. Codex, Claude Code, and future hosts are thin adapters over the same behaviors.

Why it matters

Useful workflows should outlive one model, one CLI, or one agent runtime. Skillpack is a portable working system for using coding agents sustainably: research, memory, codebase mastery, foundation audits, agent simulation, reality checks, review, live watching, trail reconstruction, skill lifecycle, media preproduction.

Stack

TypeScriptMDXClaude PluginsCodex MCP
github / skillpack
05

ReplayDeck

Live

Frame-precise YouTube A/B practice tool.

What it is

Free, no-signup YouTube A/B loop practice tool for musicians, dancers, and language learners. Frame-precise markers, timeline zoom, loop memory, stash chains, speed ramping, bookmarks, routines, import / export, PWA behavior, mobile support. Contextual coaching nudges surface from real usage patterns, and production deploys are gated on an end-to-end test suite.

Why it matters

Practicing tiny loops in long-form video should feel precise, fast, and local-first instead of clumsy. Bookmarks and stash are intentionally separated as distinct mental models. Splash, motion, and sound calibrated to feel intentional rather than generic.

Stack

React 19TypeScriptViteTailwind v4GSAPPostHog
replaydeck.com
06

Fleetwatch

Open source

Agentless macOS monitor for the whole machine fleet.

What it is

Native macOS app that watches a fleet of machines over SSH with nothing installed on the targets. Add a server by Tailscale hostname and capability detection decides which organs render: disk, memory, and CPU everywhere; Docker, services, temperatures, battery where they exist. Started as Stockpile, a single-Mac storage auditor with one hero stat, then grew into the fleet grid. Signed, notarized, shipped through a self-hosted brew tap.

Why it matters

A homelab of Macs, a GPU box, and a Windows machine scatters health across a dozen terminals. Fleetwatch is watch-only by architecture: observe over SSH, never install an agent on the target.

Stack

SwiftSwiftUISSHTailscale
github / fleetwatch
07

Purser

Private

Every project as a live node graph of its real stack.

What it is

Native macOS cockpit that scans the machine and draws every project as a node graph of its real stack: folder, framework, GitHub, Vercel, domain, database, PostHog views, env keys. One rule: nothing is hand-typed. Every value on the canvas is derived from disk or a provider API, so the graph cannot drift from reality.

Why it matters

A dozen live projects means provenance scatters across ten dashboards. Purser pulls it into one canvas. Reading a node graph beats reading a list, a habit carried over from years in Nuke.

Stack

SwiftSwiftUIVercel APIPostHog
Private
08

Voicer

Open source

Self-hosted streaming voice server on my own GPU.

What it is

Self-hosted streaming voice server: dispatcher, streaming fork, single renderer. Runs Qwen TTS on a home GPU box with the Mac as a thin audio client. About 1.1 seconds from agent turn-end to first sound, gapless. Split out of Voicepack so the voice library and the runtime stop meddling with each other.

Why it matters

Voice output for long agent sessions should default to local, private, and free per sentence. Utterances render whole on principle: tone breaks between chunks, so the server streams instead of splitting sentences.

Stack

PythonQwen TTSGPU inference
github / voicer
09

Voicepack

Open source

Local TTS voice IDs + Qwen runner for agent hooks.

What it is

Small portable voice-ID library for local TTS agents. Ships voice preset folders, metadata, and previews as self-contained, distributable voice IDs. Backs the agent-announcer hook in Skillpack; the runtime half lives in Voicer, the self-hosted streaming server it feeds.

Why it matters

Voice notifications during long agent sessions should default to local and private. Self-contained voice IDs make handoffs distributable and reproducible.

Stack

PythonQwen TTSHooks
github / voicepack
10

Jobber & Mochi

Private

Career operating layer + voice-grounded application helper.

What it is

Two halves. Jobber is the discovery, scoring, and tracking engine: wide discovery across 13+ portals, LLM-driven fit scoring against a structured personal profile, Gmail sync for application history, SQLite tracker, FastAPI dashboard. Mochi is the desktop companion (Tauri / Svelte) with a visible console for scan and draft state and a form-fill mapper: it watches the active application field, maps page fields to profile answers, and writes grounded drafts from my evidence bank before insertion. The applier side is migrating onto a self-hosted agent fleet.

Why it matters

Most job tools optimize for volume. I needed a system that widens discovery without flattening my story (because my background does not fit clean labels) and grounds answers in real evidence. Coverage and context over spray-and-pray.

Stack

PythonFastAPITauriSvelteClaude
Private