DS + CogSci @ UC Berkeley. I build local-first tools — software that runs on your own machine, keeps your data there, and automates something I got tired of doing by hand.
token-counter — audits monthly AI coding-agent spend across Claude Code, Codex, Cursor, and Gemini, and flags every run that would have been fine on a cheaper model.
fitpet — a Claude Code status-line companion that grows from real Garmin training load.
vibeapply — an AI-native job-application copilot: a browser extension that rides along on job boards, backed by a structured candidate profile and evidence bank. Scaffolded with agents, then audited — all nine findings fixed before any feature work.
cal-dining-scanner — watches UC Berkeley dining menus for the foods you care about and emails you when they appear. One command to set up, runs free on GitHub Actions.
magene-garmin-fix — Garmin inflates climb 10–70× for third-party bike computers by throwing away barometric altitude. This fixes it.
bay-area-venture-map — interactive map of the Bay Area venture cluster; filter by AUM, stage, sector, and check size.
qosmic-audit-harness — contracts-first agent harness: every claim in a generated audit must cite a real crawled page, enforced by a validator that the writer and the evaluator share.
Taxuspt/garmin_mcp — 1.1k ★, listed contributor
Garmin's API returns explicit null for sections you have no data in, so resp.get(k, {})
yields None — the default only applies when the key is absent. Most of my merged work
there is that bug and its relatives.
| #253 ✅ merged | Five unguarded null-section crashes — HRV baseline, progress-summary .items(), the sleep-score chain, body-battery event iteration, and a GraphQL {"data": null} that slipped past the existing guard. Each fix ships a regression test feeding the explicit-null payload. |
| #254 ✅ merged | Garmin occasionally stalls a request indefinitely; because every tool calls the client synchronously, one stalled call hung the whole MCP server until the client's ~4-minute timeout fired (issue #248). Bounds each proxied call on a daemon worker thread, surfacing a retry-able TimeoutError instead. Configurable via GARMIN_MCP_CALL_TIMEOUT. |
| #250 ✅ merged | Gear notes never appeared, because the pinned client reads the legacy filterGear endpoint and Notes only exists on /gear/v2/list. Joins the two — the v2 response hyphenates its UUIDs and the legacy one doesn't, so the join normalizes them first. |
| #276 | Per-sport heart-rate zone reads and writes, via read-modify-write so unrelated sport profiles aren't clobbered. Verified against a live account; documents the quirk that Garmin won't persist a CUSTOM calculation method. |
| #170 | There's a Dockerfile but no published image, so everyone builds locally. Publishes multi-arch (amd64 + arm64) images to GHCR on release — no extra secrets, just GITHUB_TOKEN. |
| #167 | The security workflow had a # Add pip-audit here if desired placeholder where the dependency scan should be. Wires up pip-audit and clears the one CVE it flags — h11 request smuggling (CVE-2025-43859). |
clash-verge-rev — 141k ★
- #7672 — importing a single
vless:///trojan:///ss://share link required creating a throwaway subscription and pasting URIs into Edit Proxy. Adds real import. - #7652 — every proxy selection rebuilt the entire native tray menu. On profiles with thousands of nodes that meant stalls and memory spikes. Caches menu handles and updates only the two items that changed.
NousResearch/hermes-agent — 239k ★
- #64036 — reasoning-visibility
leak on Gemini/Vertex: with
show_reasoning: false, users still got dozens of raw thought-summary blocks. Two causes — effort and visibility were coupled in the request builder, and Vertex returns summaries untagged unless you setthought_tag_marker, so nothing downstream could key on them. Splits the two knobs to match Google's own API. - #68524 —
web_extracthad one backend; expired credits or a rate limit meant total failure plus a gateway restart. Adds a configurable fallback chain.
Berkeley, CA — usually on a bike when I'm not here.



