Work
MrHuang
Self-hosted AI companion built on the Anthropic Agent SDK, running on a Claude subscription to avoid per-token API costs. Every conversation is stored locally on a home server, building a persistent knowledge base that commercial AI tools don't offer. Accessible via WhatsApp (Meta Cloud API webhooks) and a web UI, with voice transcription through Deepgram. Security-hardened with prompt injection defense, tool sandboxing, and zero-trust networking via Cloudflare Tunnel + Tailscale.
ClaudeExecutor wraps the Agent SDK with semaphore-based concurrency control, streaming responses, soft/hard timeouts, and exponential backoff. A ContextAssembler builds personalized system prompts from a markdown knowledge base within token budgets. WhatsApp integration uses HMAC-SHA256 signature verification, sender allowlisting, and per-route rate limiting. Hot-reloadable personality spec. Deployed as Docker containers on a TrueNAS home server with automated CI/CD polling.
TypeScriptNode.jsAnthropic Agent SDKClaudeSQLiteDeepgramDockerRadioJP
Japanese radio streaming with real-time AI transcription. A faster-whisper pipeline continuously transcribes live broadcasts, MeCab adds furigana readings, and the frontend renders word-level karaoke highlighting synced to playback. Also features HLS streaming, station search, favorites, regional grouping, and RadiKo authentication for premium streams.
A continuous Python transcriber polls stations every 10 seconds, feeding audio chunks to faster-whisper with VAD filtering and hallucination detection. MeCab post-processes segments to add kanji→furigana readings. An SSE streaming API delivers captions in real-time to the frontend, which highlights active words every 250ms with click-to-seek navigation. A caption gate pauses audio at the transcription horizon so playback never outruns captions. HLS.js handles stream playback with a three-tier recovery strategy, and a Zustand store persists player state across page navigations.
TypeScriptReactNext.jsHLS.jsfaster-whisperPythonMeCabZustandGolden Handcuff Fixer 2000
Monte Carlo financial simulator for expats weighing stay-or-quit decisions. Compare 7 scenarios side-by-side (work, quit, part-time, Coast FIRE, geo-arbitrage) or model a full life timeline across phases. Features break-even analysis, probability of ruin tracking, and a Die With Zero calculator.
Runs 10,000 log-normal return simulations per scenario with percentile tracking (10th/25th/50th/75th/90th). The phased engine carries portfolio state across phase boundaries so a 'work 5yr → part-time 3yr → quit 12yr' plan produces a single continuous simulation. Break-even uses binary search to find the minimum work years that keep probability of ruin below 5%.
TypeScriptReactNext.jsRechartsMonte CarloBudget Calculator
Cost-of-living calculator covering 10 countries across Asia and the Middle East. Five lifestyle tiers from lean to comfortable, with per-city breakdowns for housing, food, transport, healthcare, government costs, and visa fees. Data sourced from primary research and auto-generated via a YAML pipeline.
Country data lives in structured YAML research files and gets generated as TypeScript via a code-gen script — no manual edits to the runtime module. State is managed with useReducer, and a shared FX rate service with live currency conversion connects the budget output directly to the planner's scenario inputs.
TypeScriptReactNext.jsYAML PipelinePiano App (name TBD)WIP
Four piano skill games designed to make daily practice addictive. Follows the 'Typing of the Dead' model — piano skills are the core game mechanics, not a layer on top. Visual note reading, finger independence drills, bass pattern rhythm, and chord QTEs, all collecting granular performance data to surface weak spots and track progress over time.
Built on Vite + React 19 with PixiJS 8 for the space-themed game, VexFlow 5 for real-time music notation rendering, and smplr for piano sample playback. Performance data is collected per-session with a versioned localStorage schema.
TypeScriptReactVitePixiJSVexFlowMrHuang ListenerWIP
ESP32-S3 USB audio streaming device that captures speech from dual stereo microphones and streams it to mrhuang.ai for real-time AI processing. Hardware voice input extension for MrHuang.
ESP-IDF v5.5.3 firmware on an ESP32-S3. Two INMP441 MEMS I2S microphones in stereo configuration. Streams to a Python asyncio server for processing and handoff to the MrHuang backend.
CESP-IDFESP32-S3PythonHardwareUSB HID Input AutomatorWIP
Hardware modification on a Seeed Studio XIAO RP2040: the microcontroller wires directly to a mouse's switch contacts and emits clicks at randomised intervals — exploring USB HID timing, hardware-level event injection, and CircuitPython on RP2040.
Seeed Studio XIAO RP2040 microcontroller soldered to mouse switch contacts, powered by an internal LiPo. Firmware randomises intervals using a PRNG seeded from analog floor noise. A small project for learning USB HID descriptors and embedded power management.
CircuitPythonRP2040USB HIDHardware