"I'd rather build the tool than request the tool — and in 2026 that stopped being a side project and became how the org's work actually routes."
The line between "marketer" and "builder" is collapsing faster than most operating models can adapt to. In 2026 I shipped a full-lifecycle intake-to-delivery application across three phases, a merchandising planogram deployed org-wide, and a rebuilt weekly reporting pipeline — none of which were assigned to me as build work. On my own time I run a productivity app for a private pilot group, and over one July 4th visit I turned five years of my family's town tax records out of PDF purgatory and into something the whole town can search.

The tools are the evidence. The problem is always the point.
Open Tools
Public · Free · Open one and use it
Python · PyMuPDF · Tesseract OCR
Hartland, Maine Property Tax Explorer
Five years of a small Maine town's property tax records — 1,678 parcels, every assessment, every bill — searchable, mapped, and explained in plain English. Built over a July 4th visit because my family had no way to see what had actually happened to their taxes.
5
Years parsed (FY22–FY26)
1,678
Parcels, validated to the penny
29
Map sheets made clickable
Python PyMuPDF Tesseract OCR Zero backend
The town publishes everything. It publishes it as hundreds of pages of scanned PDF, which is the same as not publishing it.

Hartland's assessor releases a "commitment book" every year — every parcel, owner, valuation, and tax bill in town. It's public, it's complete, and it's a PDF. Answering "did my taxes go up?" meant printing two of them and comparing by hand. My family had been doing exactly that.

The real story turned out to be one nobody in town could see: between FY2022 and FY2026 the mill rate fell from $21.80 to $15.85 while assessed values nearly doubled. A resident whose assessment jumped 82% saw their actual bill rise 32% — a revaluation, not a tax hike. Every property lookup now says so in plain language.

  • Custom Python parser for the commitment-book text layers, validated to the penny against each year's own grand totals
  • Per-parcel receipt card with the five-year tax arc and a "why it changed" that separates rate movement from reassessment
  • Interactive atlas of all 29 assessor map sheets — 14 vector CAD exports, 7 raster scans that needed a multi-orientation OCR pipeline to locate lot labels
  • 1,537 of 1,675 parcels pinned to the map (92%), placement verified at 94–100% on-ink across every sheet
  • Ships as one self-contained HTML file — no backend, works offline, and a resident can save a copy
Open the Explorer →
HTML · JavaScript · 2026 Tax Math
Income & Tax Optimizer
An interactive tool for the question "am I maximizing my income?" — model 401(k) contributions, employer match, ESPP, and RSUs against real 2026 take-home pay.
2026
Federal brackets & FICA
Free
No login or tracking
Client-side
Nothing leaves your browser
401(k) + Match ESPP RSU FICA
Built for myself, then opened up — a real paycheck engine, not a flat-rate estimate.

Most "take-home pay" calculators apply a flat percentage and call it a day. This one runs the actual 2026 brackets, the Social Security wage base, and the Medicare surtax, then lets you pull each lever — pre-tax 401(k), employer match, ESPP discount, RSU vesting — and watch your real take-home and long-term wealth respond.

  • Real marginal tax math on 2026 federal brackets, FICA, and a configurable state rate
  • 401(k) deferral + employer match modeled against the income-tax shield (FICA still applies)
  • ESPP discount and RSU-at-vest treatment with the guaranteed immediate-sale floor
  • Long-term wealth projection so today's contribution choices show their compounding cost
Open the Optimizer →
Supabase · Cloudflare Workers · Claude API
Chief of Staff
A personal capture-triage-action system. Email or type anything — a to-do, an idea, a reminder, a half-formed note — and it gets classified, prioritized, and routed into a hub without you organizing it first.
4
Edge functions in production
Live
Running a private pilot
~10 min
Triage-to-notification cycle
Supabase Cloudflare Email Routing Claude Haiku Web Push PWA
The most complete thing I've built alone — schema, triage prompts, email infrastructure, push, and UI.

The premise is that capture should cost nothing and organization should be someone else's job. You send a message to a personal capture address or type into the app; a Claude Haiku triage function assigns type, priority, life-domain category, and effort size, splits multi-item captures into separate records, and files everything into a hub you never have to sort.

  • Email ingestion via Cloudflare Email Routing into a Worker, with a sender-approval flow for unknown addresses
  • Triage prompt now on its ninth revision — explicit priority rules, category taxonomy, effort sizing, and a splitting rule
  • Health-check function that measures staleness from queue-entry time rather than creation time, so manual re-queues don't trigger false alerts
  • Web push on a 10-minute cron for due and overdue items, plus a broadcast announcement path
  • Installable PWA with six color themes, reorderable home cards, and swipe-to-complete
Walk through the demo →

It's running a private pilot right now. If you want in, get in touch — I'm still adding testers.

React · Census API · Field Instrument
Location Signal Analyzer
Type in a county and see how dense its business landscape is against the national baseline, plus a decade of population trend. Built for the question "is there actually a gap here, or does everyone already know something I don't?"
0–200
Index vs. national baseline
2
Live federal data sources
County
Unit of analysis
Census ACS5 County Business Patterns React
Signals framed as hypotheses, not verdicts — a gap can exist for good structural reasons.

Most "best places to start a business" content is ranked listicles with no visible method. This runs live Census calls — American Community Survey for population, County Business Patterns for establishment counts by NAICS code — and indexes the result against the national average so the number means something regardless of county size.

  • Gauge instrument reading business density 0–200 against a national baseline of 100
  • Population sparkline over the available ACS year range, with failed year-calls filtered rather than crashing the run
  • Explicit framing in the UI that a low reading is a question to investigate, not an opportunity confirmed
  • Field-surveyor aesthetic — monospace, muted earth and teal, no growth-hacking gloss
In the works — working prototype coming soon
Built Inside T-Mobile
In production · Can't link these — here's what they are
Airtable · React · Three Phases · 2026
Full-Lifecycle Intake-to-Delivery Application
The working system — not a requirements doc — for how work enters, moves through, and leaves the org. Shipped across three phases in 2026.
5,492
Tickets analyzed to ground the design
1,671→30
Columns that carried signal
3,951
Subtasks across 681 deliverables
Airtable React Claude Code Workflow Automation
Started as a fast-track lane for quick-turn requests. Ended up replacing the whole intake path.

This began as a parallel intake route for rush requests that didn't fit the standard process and kept getting stuck in it anyway. Building that made it obvious the standard process was the problem, so I analyzed how the existing system was actually used — 5,492 tickets across 1,671 columns — and found roughly 30 columns carried real signal and 92.7% of volume was a single work type. The redesign was built for that reality instead of the documented one.

  • Phase 1 — AI-assisted brief coaching, upstream data prefill, a four-level brand cascade, a work-breakdown editor with per-task assignment and lock/unlock, a lead workspace, handoff view, and in-app feedback
  • Phase 2 — personal project and task views with inline status, plus calendar and Gantt swimlanes
  • Phase 3 — end-to-end automated team-channel provisioning: button → record → webhook → channel, routed around a data-loss-prevention constraint that blocked the obvious integration path
  • Work tier is auto-derived and hidden from the requester, who sees only a T-shirt size — which removed the negotiation that had been distorting intake for years
React · Airtable · Claude Code · 2026
Digital Merchandise Planogram & Content Control Tower
A week-by-week placement grid for digital merchandising across T-Mobile's web surface, and the filterable command view sitting on top of it that answers "what's live right now?"
4,500
Lines of code
Org-wide
Deployment
0→1
Manual workflow eliminated
React Airtable Extensions Claude Code
Self-initiated. Identified the gap, scoped the solution, shipped it without a ticket.

Merchandising placement used to live in spreadsheets that were always stale and always a source of escalation during launches. Answering "what's live on the digital surface today?" meant querying several trackers and chasing people in chat. This replaced both.

  • Week-by-week placement grid with real-time conflict detection across placement types
  • Four-step intake wizard that enforces data quality at the point of entry
  • Filterable real-time view of everything active, launching, or recently ended across the DBM surface, auto-sorted by launch state
  • Campaign simulator for "what if" planning before slots lock
  • Partner-facing view that cut "what's live?" interruptions to near zero
  • Deployed org-wide, not just to my team
Patterns
The reusable ideas underneath the builds

Most of what's above is internal, so the code isn't something I can show you. The ideas are. These three have each been reused past the project that produced them.

Pattern 01
Pull-based integration inversion

An IP-allowlisting rule between two systems had stalled an automation for months. The standard fix is a network exception request, which is a quarters-long conversation with a security team. Instead I inverted the direction of the call: rather than pushing from the blocked side, I used the ticketing platform's own scripting layer to pull from inside the allowlisted perimeter. The constraint stopped mattering.

When an integration is blocked by a network boundary, check whether either side can initiate — the block is usually directional, not mutual.

Pattern 02
Tier auto-derivation, hidden from the requester

Work tiers had become a negotiation. Requesters knew what tier meant for turnaround and staffing, so they optimized their submissions for the tier they wanted rather than describing the work honestly. That corrupted the intake data at the source.

The fix was to stop asking. Tier is now derived from project type, level of effort, page URL, and attachment count, and it's visible only to the internal lead. The requester sees a T-shirt size.

Removing the lever removed the incentive to pull it, and the intake data got honest.

Pattern 03
The fail-loud data model

A weekly performance deck was generated from a slot-driven, deck-first architecture: each slide knew which cell it read from. When a section dropped out of the source extract, the slide didn't error — it silently reused last week's numbers. Nobody caught it, because a stale number and a fresh number look identical on a slide.

I rearchitected it onto a canonical long-format model — one row per section, subsection, entity, metric — behind a query layer that raises rather than returns empty, with the presentation formulas isolated in their own layer. The companion validation pass caught four real mapping bugs that row-count checks would have missed, including a semantic subclass bug where "Prime" was matching "Sub-Prime."

Now if a section drops out of the extract, it drops out of the deck. A visible gap is a bug report; a stale number is a wrong decision.