jaren@kempton:~$ whoami

Jaren Kempton

❯ I build the platforms, MCP servers and CI guardrails that let AI agents do useful work in real codebases.

jaren@kempton:~$ neofetch
Jaren Kempton

jaren@kempton

role
Senior Full Stack Engineer
focus
Developer Platform / AI Tooling
location
Queen Creek, AZ

jaren@kempton:~$ cat principles.md

# How I work

  1. Boring on purpose

    Hard problems are fine. Code that needs deep knowledge of the whole system to change safely, or has side effects nobody would expect, isn't. When I find that, I look for a way to simplify the core structure instead of adding another workaround.

  2. Don't reinvent the wheel

    I'd rather write a small thing than add a dependency for it, because every dependency is something outside my control that can break. But when an open-source standard can replace a pile of custom code and make it consistent, that's the one I pick.

  3. Throwaway code, bombproof product

    Agents are great at writing long-running evals and test harnesses nobody ships. That temporary code is how the code that does ship gets to be boring.

jaren@kempton:~$ cat about.md

# About

Most of my work sits underneath other people's work: the knowledge service agents search, the conventions CI enforces, the component library every app shares. I like making a messy system smaller and easier to change, and I measure whether it actually got better.

Lately that mostly means AI agents: giving them good context to search, conventions CI can enforce, and evals that show whether a change actually helped. The same things make a codebase easier for the people working in it.

jaren@kempton:~$ cat stories/*.md

Running agent workloads on my own hardware

Problem
Heavy PR traffic and a lot of parallel agent runs made GitHub Actions minutes expensive.
What I did
I moved the heavy jobs onto computers I already had. GARM runs the self-hosted runners and CLIProxyAPI lets agents on every machine share the same subscriptions. Both already did the hard part well, so I built the dashboards they were missing: which PR a runner is working on, what usage costs, and what's slow.

┤ GARM Dashboard ├

Active 2026

Which PR is that self-hosted runner working on, and is it slower than usual?

A read-only dashboard that joins GARM's pools and runners with the GitHub Actions API: live runs grouped by PR with each job against its usual duration, plus 24h/7d/30d stats for queue wait, p50/p90 workflow time, boot time per pool, and the slowest and failing jobs.

  • [TypeScript]
  • [React]
  • [Hono]
  • [SQLite]
  • [GitHub Actions]

github ↗built onGARM ↗

┤ CLIProxy Dashboard ├

Active 2026

A better management UI for CLIProxyAPI, plus the usage history it doesn't keep.

Quota windows on a timeline with pace against the reset, cost and tokens by provider, model, machine and key, OAuth account management, client key setup, and a config editor that shows a diff and snapshots the previous file on every save.

  • [TypeScript]
  • [React]
  • [Hono]
  • [Vite]
  • [Docker]

github ↗built onCLIProxyAPI ↗

Seeing where my AI usage goes

Problem
With agents running across several tools and machines, I couldn't tell how close I was to my limits or why one session cost far more than another.
What I did
Burn collected quota windows and token use from every tool on every machine and kept the history locally. Once all my machines ran through CLIProxyAPI, I ported Burn's usage history into the CLIProxy Dashboard and retired it. Quench reads the session logs agents already write and shows what each session loads and where runs go wrong.

┤ Burn ├

Retired 2026

Local-first usage and quota history for the AI tools you already pay for.

One executable that runs as a server or a collector. Collectors on each machine gather quota windows, token use, credits and inference speed from Claude Code, Codex, OpenRouter and LM Studio, and report to a server that keeps the history in SQLite. Enrollment is a browser-approved device flow, and provider credentials never leave the machine that collected them.

lives on in CLIProxy Dashboard

  • [TypeScript]
  • [Hono]
  • [SQLite]
  • [Tailscale]

github ↗

┤ Quench ├

Active 2026

See what your coding agents load, what it costs, and where they go wrong.

Reads the session history Claude Code, Codex and Pi already keep on disk and reports how much context each session starts with, how it grows, which models and effort levels you use, and how each run went. Ships as a single binary for Linux and macOS. Nothing leaves your machine unless you opt in.

  • [TypeScript]
  • [Bun]
  • [SQLite]

github ↗

iMessage on Linux

Problem
I daily-drive Linux on Omarchy, and iMessage only runs on Apple devices.
What I did
BlueBubbles already bridges iMessage from a Mac, so I built the native desktop client I wanted on top of it with GPUI, in a day.
See also
Omarchy ↗

┤ BlueBubbles GPUI ├

Active 2026

iMessage on Linux, as a native desktop app.

A native desktop client for a BlueBubbles iMessage server, written in Rust with GPUI. Built in a day.

Clocking in with a switch

Problem
I split my time between two companies, and remembering to start and stop the right timer got old fast.
What I did
I had an ESP32 and a three-position switch lying around, so I wired them up: left or right clocks me in for a company, middle clocks me out. Each flip sends an event to a Cloudflare Worker, which hosts the dashboard and keeps my session history in D1. A Durable Object handles the real-time side, so the dashboard updates live on my phone and computer the moment the switch moves. If I forget to clock out, I fix it from wherever I am, and I can edit history or whole pay periods when I need to.

┤ Time Switch ├

Live 2026

A physical switch on my desk that clocks me in and out.

A three-position switch wired to an ESP32-C3: left and right start a work session for one of two companies, middle stops it. A Cloudflare Workers dashboard updates live and keeps hours and pay-period history behind Cloudflare Access.

  • [C]
  • [ESP32]
  • [TypeScript]
  • [Cloudflare Workers]
  • [D1]
  • [Durable Objects]

github ↗

jaren@kempton:~$ ls -l ~/projects

All projects
statusyearname
Active2026quench/
Retired2026burn/
-> cliproxy-dashboard/
In development2026interlock/
Live2026time-switch/
Active2026cliproxy-dashboard/
Active2026garm-dashboard/
Active2026bluebubbles-gpui/
Client work2025mtb-suspension/

total 8

jaren@kempton:~/projects$ cat featured/*

┤ Quench ├

Active 2026

See what your coding agents load, what it costs, and where they go wrong.

Reads the session history Claude Code, Codex and Pi already keep on disk and reports how much context each session starts with, how it grows, which models and effort levels you use, and how each run went. Ships as a single binary for Linux and macOS. Nothing leaves your machine unless you opt in.

  • [TypeScript]
  • [Bun]
  • [SQLite]

github ↗

┤ Interlock ├

In development 2026

Claim a ticket, get a worktree, hand it to an agent.

A CLI that claims a Jira ticket, prepares its Git worktree and returns what a T3 Code thread needs to launch an agent lane on it. Credentials live in the OS keychain, and a doctor command names exactly which sign-in, permission or push access is missing.

  • [TypeScript]
  • [Bun]
  • [Jira]

github ↗

More projects: jaren@kempton:~/projects$ cat more/*

┤ MTB Suspension Repair ├

Client work 2025

Business site for a mountain bike suspension service.

Service and pricing information for a local suspension repair shop, built to turn visits into booked repairs.

  • [React]
  • [Tailwind CSS]

live site ↗

jaren@kempton:~$ git log --graph career

  1. Symphosize(HEAD -> current)Part-time

    • Technical ConsultantJun 2026 — Present
    • Interviewed everyone in product and engineering to map friction in the product pipeline, then drafted solutions and drove them into general adoption.
    • Own architecture and the MCP layer for the resulting pipeline app. Brought a fast-growing codebase back under control, consolidating 5 backend layers into 1 and deleting 60k+ lines without pausing feature delivery.
    • Encoded the architecture into CI-enforced conventions and automated sweeps, so AI-assisted feature work lands close to the target design without manual guidance, at ~20 merged PRs a day.
    • Own the company knowledge service that serves docs, code, Jira and business metrics to AI agents over MCP. Cut search p95 4× (27.6 s → 6.7 s), then designed a BM25 + vector + reranking pipeline benchmarked at ~70% better ranking on held-out real queries.
    • Built a retrieval eval from 1,500+ logged production queries with a held-out split and bootstrap confidence intervals. It caught the live vector index returning only 37% of true neighbors and ruled out a larger embedding model whose gain wasn't significant.
    • [TypeScript]
    • [MCP]
    • [PostgreSQL]
    • [GitHub Actions]
  2. SalesAi

    • Full Stack DeveloperFeb 2026 — Oct 2026
    • Built the shared React component library for every frontend app, kept in sync with the design team's Figma system so the product ships one consistent UI.
    • Hardened credential storage across 3 services and every environment with zero downtime.
    • Expanded a voice-only sales platform to SMS for every customer and added Commio as a second phone provider, opening the platform to customers already committed to it.
    • [React]
    • [TypeScript]
    • [Storybook]
    • [Figma]
  3. The Church of Jesus Christ of Latter-day Saints

    • MissionaryOct 2023 — Oct 2025
    • Technology SpecialistSep 2024 — Oct 2025
    • Automated processing of 100+ weekly emails and texts with Google Apps Script.
    • Maintained Rust software analyzing 1,000+ records weekly, and supported 150+ volunteers.
    • [Rust]
    • [Google Apps Script]
  4. ResponsiBid

    • Junior DeveloperMay 2022 — Oct 2023
    • Developer InternMay 2021 — Jul 2021
    • Worked heavily in the legacy CakePHP platform while helping build its TypeScript replacement in React/Next.js and NestJS GraphQL.
    • Helped introduce TDD in an Agile team, raising test coverage in a 1.2M-line codebase from 0% to 24%.
    • [CakePHP]
    • [React]
    • [Next.js]
    • [NestJS]
    • [GraphQL]
    • [Jest]
  5. Independent

    • Self-Taught Developer2020 — 2021
    • Discovered a passion for building things with code. Spent time learning vanilla JavaScript, HTML/CSS, Python, Java, and Arduino C++ through personal projects and experimentation — building everything from web pages to hardware prototypes.
    • [JavaScript]
    • [HTML/CSS]
    • [Python]
    • [Java]
    • [Arduino]
    • [C++]

jaren@kempton:~$ tree ~/skills

skills/

4 directories, 26 files

jaren@kempton:~$ cat contact.txt

# Say hello

location
Queen Creek, AZ

jaren@kempton:~$

© 2026 Jaren Kempton· thanks for stopping by