Daniel Gentile

HELM

A personal operating system: phone client, dashboard, voice, and scheduled routines on one Mac.

2025 to 2026. Live

  • TypeScript
  • Svelte 5
  • Python
  • Claude Agent SDK
  • Hono
  • launchd

Problem

I keep my life in a private notes vault: work, projects, chess, and home, each with its own todo lists and files. The vault is good at holding things and bad at telling me what is late. I wanted one place that reads the vault and shows what needs attention, lets me drive Claude Code from my phone when I am away from the desk, and runs the boring jobs on a schedule. And I wanted the engine public without a single line of my personal data in the repository.

Approach

HELM runs on one always-on Mac and knows nothing about me until it reads the vault. Three homes, kept apart: the repository is public, the vault is private with no remote, and runtime state lives in a dot folder outside both. A fail-closed commit guard scans every commit for personal data before it leaves the machine.

Four parts. Helm Chat is a phone app over the Claude Agent SDK. Each thread is an append-only event log, and the state you see is a pure fold over that log, so a phone that relaunches mid-turn replays the log and then picks up the live stream without losing an event. The dashboard is a Python server plus a Svelte front end that draws the vault as a pressure map: what is late, due, or starred across the four areas. Voice is a local, CPU-only speech server for push-to-talk. The runner turns a model registry file into scheduled jobs: capture, integrity check, backup, and a morning job search that runs as a seven-stage cascade over a pool of postings with cached verdicts.

One decision I keep coming back to. An early version used a language model to produce a daily feed. I ran it headless 712 times and 689 outputs were identical. A deterministic transform replaced it at roughly a thousandth of the cost.

Tech

TypeScript and Svelte 5 for the chat and the dashboard, Hono for the HTTP layer, the Claude Agent SDK for sessions, WebAuthn passkeys for the door, Server-Sent Events for streaming, Zod for parsing at the boundary. Python for the dashboard server, the runner, and the voice server (faster-whisper and Kokoro). launchd for scheduling. The Mac is reached over a private tailnet; the services bind to loopback only. GitHub Actions runs four jobs. About 860 tests across five suites, all green, and 36 decision records.

My contribution

The architecture, the data model, the security perimeter, and every decision record are mine. The specific shapes that matter were my calls: the three homes, the event log with state as a fold, the commit guard, the passkey door over the tailnet, the model registry as the single place that says which model runs which job, and the deterministic feed. I wrote the specs and the rules file the agents read. I reviewed every diff and I merged every commit. HELM 1 shipped with a different front end and a cloud deploy; I retired it, tagged it, and rebuilt the chat from a sketch in two days in September.

AI usage

Most of the implementation was written by Claude Code, working from specs I wrote and reviewed. All 328 commits carry a co-author trailer naming the model. The chat’s design document came out of three independent candidate designs from three models, judged against each other before I picked one. Twice I overrode the agent’s version with my own, and the decision records say where.

Lessons

A routine stopped producing output on 2 August 2026 and nobody noticed for three weeks. Every scheduled job now has a freshness check, and a silent job is treated as a failed one. Committing straight to main is fast, but it turns continuous integration into an alarm that goes off after the fact; I accept that for a one-person project and would not for a team. And one decision record had three of its five consequences struck out a month later. Writing them down is what made that visible.

Back to projects