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.

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

Alpha

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` is the headless version: distill a Codex session, write a Claude-native session, get the resume command. Reads and writes local runtime session files only.

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, max-prompt, skill-advisor, 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, prompt translation, 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, import / export, PWA behavior, mobile support.

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

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, previews, and a Qwen runner / server that turns text into speech on the user's own machine. Backs the agent-announcer hook in Skillpack so a local Qwen voice speaks turn handoffs instead of OpenAI or ElevenLabs.

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
07

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) that watches the active job application field, captures page and field context, pulls from my evidence bank, and writes grounded drafts before insertion.

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