Projects

Things I've built across software and data: tools, apps, models, and experiments, some polished and some still in progress.

InoInk

A standalone, offline-first Inoreader reader for the Kobo Libra Colour, built on the Plato document reader, with e-ink typesetting and sync straight to the Inoreader API.

ruste-inkkoborss

defenestrator

Throws out a spent Claude 5-hour usage window and starts a fresh one when it helps most, with one tiny ping timed from a replay of your last 28 days. Docker image with Grafana boards.

coding-agentsclaude-codecodexgrafanadockerpython

effort-cubes

The Rust engine behind effortcurve.com: exact mean-max effort curves from 1 Hz activity data, with Python and WebAssembly bindings.

rustpythonsports-science

backup-mcp

A deliberately narrow MCP server that re-runs a homelab's backup jobs on demand, so automation can redo a failed backup without being handed Docker. No tool takes a command or path.

mcphomelabdockerbackupstypescript

Garmin MCP

An MCP server for Garmin Connect backed by a complete local DuckDB mirror: every activity with its FIT file, sleep, HRV, stress, Body Battery and gear, plus read-only SQL.

mcpllm-toolsgarminduckdbpythonself-hosted

Paperless MCP

A library card for a Paperless-ngx archive: local semantic search returning passages, filing from a URL, notes, per-audience libraries. Began as a fork of baruchiro/paperless-mcp.

mcpllm-toolspaperlessself-hostedtypescript

aac-touchid

Touch ID for coding agents' credentials: a Mac listener for Bitwarden Agent Access shows who is asking and why, and releases a password or 2FA code only when you touch the sensor.

coding-agentssecuritybitwardenmacosrust

telebrowser

Real browsers for coding agents on a headless box: a persistent Chromium per project over CDP, plus a handoff so you can open it for a sign-in, captcha or 2FA step.

coding-agentsmcpbrowserhomelabdocker

herdr-undo

Reopens the last closed herdr pane, tab or space with its layout, directories and labels, and resumes the agent sessions that were running there. Repeat to go further back.

coding-agentsherdrpython

herdr-git-status

Git state for every herdr space: one compact token for uncommitted work, ahead/behind counts and conflicts, with worktrees under their parent. Never shows a falsely clean result.

herdrgitpython

MinusPod MCP

A narrow, authenticated MCP server for MinusPod, the self-hosted podcast ad remover: find podcasts, add feeds, watch the queue and spend. Nothing can delete or change settings.

mcppodcastsself-hostedtypescript

agent-scrub

Lets a coding agent mask credentials in its own session log when it is done with them. Uses gitleaks rules and this machine's secrets, and asks Jev about ambiguous hits unseen.

coding-agentssecurityclaude-codecodexpiopencodetypescriptjev

Pi Plugins

A modular workspace for coding with Pi: plan deliberately, delegate work, keep context useful, and review changes in the conversation. Thirty-two selectable extensions, one suite.

coding-agentspitypescriptdeveloper-tools

herdr-agentbox

One herdr space per AgentBox box: every sandboxed agent the hub owns, wherever it runs, with live state in herdr's sidebar. Pause, resume and destroy from the pane.

coding-agentsherdragentboxpython

herdr-machine0

One herdr hub for agents running on many small per-project machine0 VMs: spokes cloned from a golden image, subscription logins kept on the hub, idle auto-suspend and wake on Enter.

coding-agentsherdrshell

paseo-machine0

Per-project Paseo spokes on machine0 VMs, created, woken, suspended and kept logged in from one always-on hub.

coding-agentspaseoshell

pi-brokered-auth

pi OAuth providers that read credentials from a file a hub keeps fresh, so a fleet of VMs shares one set of subscription logins.

coding-agentspitypescript

anthropic-billing-guard

Warns the moment Anthropic bills a pi or opencode request to extra usage instead of the Claude plan, read from the header that says which pool paid.

coding-agentspiopencodetypescript

herdr-repeat-navigation

tmux-style timed navigation repeat for herdr: one prefix, then j/k/h/l/n/p keep moving across spaces, tabs and panes until 500 ms pass.

coding-agentsherdrtypescript

Fish in the Sea

How many people could you actually date? A Census-based sieve for every US metro and county: filter step by step and see who's left, each step labeled by its data source.

censuspythonnext.jsdata-visualizationweb-app

tmux-agents

Coding-agent state on tmux window tabs (waiting, done, running) and desktop notifications for agents running outside herdr. Hooks for Claude Code, Codex, pi and opencode.

coding-agentstmuxclaude-codecodexpiopencodeshell

GroundCover

Strava counts every mile you log; this counts the ground those miles cover: 10,639 logged miles resolved to 3,975 miles of distinct road and trail, computed in your browser.

typescriptdeck.glmaplibrestravaweb-app

29ers

A parody of 14ers.com for the tallest mountains in the solar system: thirteen peaks that out-top Everest, with an earnest trip-planning site for summits nobody has reached.

htmlcsspythonstatic-siteparody

shipshape

A Docker image update bot for a single-host Compose homelab: opens real GitHub PRs, has Claude judge upstream changelogs, auto-merges what policy allows, and deploys. Keeps forks rebased.

homelabdockergithubllm-toolstypescript

bayesDAG

Shape-first, posterior-aware visualizations of PyMC models — render a probabilistic model as an interactive Kruschke-style DAG with in-node density curves, real LaTeX, and prior/posterior overlays.

bayesianpymcvisualizationpythonreact

Homelab

A single-host homelab running 50+ Docker Compose stacks behind OPNsense, Traefik and Authelia: media, documents, monitoring, a home for coding agents and self-hosted MCP servers.

homelabself-hosteddockerinfrastructurenetworkingcoding-agentsmcp

ArviZ MCP

An MCP server for exploring Bayesian model outputs with ArviZ — load InferenceData, run convergence diagnostics, query posteriors, and compare models straight from an LLM.

mcpbayesianarvizpython

cloudposterior

Stop waiting for MCMC. A context manager that offloads PyMC sampling to cloud VMs with zero code changes — smart caching, a live dashboard, and a push notification when your posterior is ready.

bayesianpymcpythoncloud

Hardcover MCP

An MCP server for the Hardcover books API: search titles, manage your library, build lists, and track reading goals from an LLM. Runs locally over stdio or as a Docker service over Streamable HTTP.

mcpllm-toolsbookstypescriptself-hosted

Inoreader MCP

An MCP server for Inoreader: triage articles, analyze feed health, tidy subscriptions, and find replacements for broken feeds. A Docker service over Streamable HTTP with OAuth.

mcpllm-toolsrsstypescriptself-hosted

Strava MCP

An MCP server for your Strava account backed by a complete DuckDB mirror: activities, streams, segments, routes and gear. Millisecond answers with no API spend, kept fresh by webhook.

mcpllm-toolsstravaduckdbtypescriptself-hosted

YNAB MCP

An MCP server for the full YNAB API plus guided workflows: audit the budget, plan the month, suggest categories, match transactions to receipts, flag every change for review.

mcpllm-toolsynabtypescriptself-hosted

Inoreader for Obsidian

An Obsidian plugin that syncs your Inoreader highlights, annotations, and saved articles into your vault with incremental sync and templating.

obsidianplugintypescript

Pacing

A Bayesian model for ultramarathon pacing — turns a course's elevation profile and your fitness into a data-driven pacing strategy.

bayesianpymcpythonrunning

SwimCue

A CLI that generates custom freestyle swim-training audio — spoken cues, kick beats, and breathing patterns mixed into a single track you can swim to.

pythoncliaudio

IFS Journal

The journaling that helps you understand yourself

web-app

VertFarm

Plan terrain-aware routes in the browser: drop waypoints on a topo map and a Rust + WebAssembly pathfinder respects your maximum slope and avoids aspects you choose, client-side.

web-apptypescriptreactwasm