Tracking4
Dashboards9
AI agents7
Everyday apps7
Research3
I build the systems behind the dashboard.
GPS tracking you can ride with, operations consoles that cite their sources, and AI agents that are allowed to say no.
Running right now
checked at build- Miles Trackingmilestracking.com, answered in 217 ms
- Sentinel HSEsentinel-hse.pages.dev, answered in 140 ms
- Fun Finderfunfinder.org, answered in 295 ms
- Receipt Snapreceipt-snap-efa.pages.dev, answered in 159 ms
The page asks each product whether it is up, the way my tracking systems ask a bus.
The same work, drawn as a map
Every line on this map is a kind of system I have shipped. Every station is one of them. An interchange is a project that is more than one thing. Tap a station to read about it.
Tracking
Where things are right now: vehicles, trips and the people waiting for them.
-
Miles Trackingalso on the Everyday apps line
Open milestracking.comA subscription live-vehicle map for small transit agencies, shuttles and fleets. A phone or an installed tracker reports position, riders see the bus on a map they can embed in the agency's own website, and the agency gets GTFS and GTFS-Realtime feeds without hiring anyone.
- 1,165
- automated checks behind one verify command342 shared, 604 platform, 108 web and 111 end-to-end, recorded September 2026
- 5
- host websites the embed was proven insideincluding WordPress and a hostile page
- 19
- database migrations applied in production

The rider map in 3D. Stops are named, the bus is live, and the whole thing embeds in an agency's website. 
The public site, built with its own prerender so every page is crawlable. Built with Cloudflare Workers, D1 and Durable Objects; a Vite and React rider map; MapLibre with 3D buildings; Traccar on a Linux VPS for hardware ingest; a Python GTFS toolkit.
Back to the board -
Miles Tracker
The phone app a driver runs. Scan a QR code to join an agency, tap once to share a time-limited link, and the phone becomes a GPS tracker. It is a Flutter fork of the open-source Traccar client with the Firebase telemetry removed.
- 1
- tap to share a link that expires when you say so
- 0
- third-party trackers in the app

Tracking on, one button to share. Built with Flutter and Dart; iOS build proven through CI from a Windows machine; Android APK side-loadable by QR before either store listing exists.
Back to the board -
TripPulse
A traveler's co-pilot for the moment a trip breaks. It ranks air, rail, road and transit options by speed, cost, reliability, accessibility and carbon, tells you which refunds the 2024 US DOT rules owe you, and drafts the claim.
Not public yet. The code is one deploy from live.
- 249
- transportation data sources in its library94 of them real-time
- 6
- live federations: flights, trains, airspace status, weather alerts, directions and transit

The status screen says which feeds are live and which are stand-ins. It never pretends. Built with A no-build progressive web app; Cloudflare Functions and KV; FlightAware, Duffel and Amtrak feeds; web push; a GitHub Actions sidecar that pre-warms flight prices.
Back to the board -
50-state agency study
Before building Miles Tracking I measured the market. A crawler read every US transit agency website it could find and recorded whether riders can see their bus today.
- 8,167
- pages read across 787 agency websites
- 1,488
- agencies with no rider-facing tracker747 had one; 409 were marked strong prospects
Built with Python, with the findings in a spreadsheet and an HTML report.
Back to the board
Dashboards
Operations consoles over real public data, with confidence intervals and a citation on every claim.
-
Airfield Construction Referencealso on the AI agents line
A reference and verification tool for airfield construction. Check an aircraft against a real runway on length, width, pavement strength and surface; verify a design against FAA and ICAO standards; ask a question and get an answer that cites its source or declines.
Runs locally today. Not published yet.
- 8,960
- airports with their runwaysfrom 85,597 raw records
- 446
- standards sources behind 99 cited answers
- 1,553
- automated assertions in its gate

Each check names the advisory circular it comes from. The one it cannot verify says so. Built with Version one is a single offline HTML file generated by Python. Version two is React and TypeScript on Cloudflare with Postgres, a vector index and Claude.
Back to the board -
Amtrak Operational Intelligence
One self-contained HTML file that joins twenty-eight months of train status with the full timetable corpus and a live position feed. On-time performance comes with a confidence interval, and the Pain Points tab ranks recurring problems by frequency times severity.
- 3.2M
- station events across 584 trains and 533 stations
- 576
- timetable PDFs parsed into 364 trains and 49 routes
- 0
- network requests needed to open it

Built on my own time from public data. Every headline carries its interval. Built with React, Recharts and Leaflet in one 12.7 MB file; a compressed data cube; Python for the extract and transform.
Back to the board -
Trading 9.15also on the Research line
A research-first system for a very small account. Every strategy is pre-registered before it is tested, the holdout data has never been read, and the strategies that failed their gates are published in a graveyard, with the reasons.
- 94
- recorded experiments, zero holdout unlocks
- 6
- candidate strategies tested; all six failed their gates
- $0
- of real money connected

The dashboard leads with the sentence most trading sites hide. Built with Python with pytest; daily bars and a paper account; a control-room dashboard that states plainly that nothing has passed.
Back to the board -
Diamond Dashboard
A daily screener for the options wheel. Each morning it pulls chains, earnings dates and the macro calendar, scores every candidate on nine components, and writes one offline HTML sheet. A pre-registered study records whether the score predicts anything, in an append-only ledger.
- 246
- unit tests across the pipeline
- 9
- score components, each explained on the sheet

The sheet is one file. It works with the network off. Built with Python standard library only; a Windows scheduled task; a public sheet with no private data on it.
Back to the board -
CDAN-NG crash data networkAt work
A clean-room prototype of a modernized national crash-data network. It takes crash feeds from five states in five formats and maps them to the national standard, and it is built around the error a matching field name hides: the names agree but the definitions do not. Every record ends in exactly one state, lineage is traceable, and an AI suggestion applies only after a named person approves it.
Built for a federal request for information. Every crash record is simulated; the one real mapping comes from a published state report.
- 204
- automated checks: 121 on the engines and exports, 83 in a real browser
- 50,000
- records in the scale run
- 866
- national attributes mapped for one real state crosswalk382 unmapped; 303 of them need a change to the state's crash-report form

Every figure is recomputed from the raw feeds on load, and the reconciliation line proves nothing was discarded. All crash records are simulated. Built with React 18, TypeScript, Vite, Tailwind and Recharts; pure TypeScript engines; Cloudflare Pages Functions or a Node container with a PostgreSQL schema; Playwright; a one-file offline build that makes no network request.
Back to the board -
FAA Operational IntelligenceAt work
One file over seven years of US flight operations at the top 200 airports, built to answer where the system breaks, why, and what to fix first. It runs from an overview through pain points, root cause, a drill-down map and customer impact to a ranked list of actions.
- 42.1M
- flights tracked, 2019 to 202544.0M in the data window
- 934K
- cancellations
- 15.9%
- of carrier and airport clusters drive 75% of delay minutes

Public data, one file, nine tabs. The headline numbers are the ones the data supports. Built with React and Recharts in one 7.4 MB HTML file; Python for the extract and transform; public on-time, capacity and safety-report data.
Back to the board -
MetroPulseAt work
A performance dashboard for the chief performance officer of a large metro agency, built to replace the seven tools opened every morning with one screen. Thirty-five months of ridership sit beside live incidents, vehicle positions, arrival predictions, elevator outages and the weather.
A proposal prototype on the agency's public data. The agency is not named here.
- 35
- months of ridership, January 2023 to November 2025
- 6
- views, from executive summary to rider impact
- 30 s
- refresh on the live panels

The agency's published ridership, drawn so a board member reads the story in one screen. Built with A single-file HTML dashboard; a small Node proxy for the agency's public APIs and the weather service.
Back to the board -
TransitPulseAt work
Why buses run late, explained with the data a city already publishes. On-time performance, ridership and the schedule are joined with 311 complaints, street closures, crashes and emergency dispatches, so a recurring delay shows its cause beside it.
A concept built on open data, not endorsed by the agency, which is not named here.
- 104
- routes, 6,428 stops and 1.27M scheduled stop times
- 929,773
- 311 service requests joined to the network
- 65.7%
- weekday on-time performance, matching the agency's published figure

The dashboard figures are synthetic and say so on the screen; the record counts behind it are real open data. Built with A single-file HTML dashboard with Chart.js; Python for the analytics; a SQL schema over the city's open-data portal.
Back to the board -
Warranty RecoveryAt work
Finds money a fleet is already owed. It connects to the maintenance system and looks for three things: warranty claims never filed, repairs that match a later recall campaign, and vendor penalties assessed but never collected. Each finding carries an evidence trail and a drafted claim package.
No dollar headline is quoted here on purpose: the first one was an artifact of a single rule, and the project retracted it.
- 210
- automated tests, green on 19 September 2026
- 943,586
- warranty coverage rows in the real datasetwith 1,145 claims and 1,554 penalties
- 3
- kinds of finding, each with its evidence
Built with Python, DuckDB and Streamlit; pytest; Docker; readers for public recall data from NHTSA, Transport Canada, the FAA and the FRA.
Back to the board
AI agents
Assistants with a rule book: a deterministic step before any model, and a refusal when the source is missing.
-
Agentic OS and Athenaalso on the Everyday apps line
A personal command center that reads my apps, routines, memory and skills live, draws them as a three-dimensional graph, runs headless coding sessions on a schedule, and answers to a wake word I trained myself. There is a phone app with a passkey lock so I can reach it from anywhere.
- 22,000
- synthetic clips used to train the Hey Athena wake word
- 18
- verification suites, from the passkey lock to the Android emulator

The demo board. Every name and number on it is made up, by design, so it can be shown. 
The phone view, behind a passkey. Built with Node and vanilla JavaScript; a terminal and editor in the browser; an ONNX wake-word model; a Kotlin Android app; WebAuthn passkeys; Tailscale for remote access.
Back to the board -
Sentinel HSE
Open sentinel-hse.pages.devIncident reporting for oil and gas field workers in five languages, including Hausa, Yoruba, Igbo and Nigerian Pidgin. A deterministic escalation rule runs before any AI sees the report, and the assistant either cites the safety document or says it cannot answer.
- 5
- languages with zero untranslated strings
- 370
- unit tests, plus 47 smoke, 125 wiring and 22 blocker checks
- 16
- guarantees enforced in the database itself

The live demo. The company in it, Northwind Energy, is fictional. Built with React 19 and TypeScript; Cloudflare Functions; Postgres with pgvector; Docker for the full stack; Vitest and Playwright.
Back to the board -
Lead Snap
Photograph a business card and it becomes a contact, a research brief and a row ready for Salesforce, HubSpot, Zoho or Dynamics. A guest mode runs the text recognition entirely in the browser so nothing leaves the phone until you choose.
Not public yet.
- 27
- parser cases, every one green
- 4
- CRM export presets, written without a spreadsheet library
Built with React and Vite; Cloudflare Functions, D1 and R2; Workers AI for vision OCR and briefs; Tesseract.js for the offline guest mode.
Back to the board -
DATA-TALKAt work
A natural-language assistant over enterprise data: a business user asks a question in plain English and gets the answer, the SQL and a chart. My part was the demo film: re-cut, re-narrated with a local neural voice and given a sound design, so the product shows itself in under two minutes.
- 164
- of 181 evaluation questions answered correctly in the published harnessvisualization 21 of 21; plain SQL 29 of 30
- 104 s
- film, cut from 120, mixed to broadcast loudness
- 29
- synthesized sound cues
Built with For the film: Python with ffmpeg, Demucs for stem separation, Kokoro text to speech and Whisper for the transcript.
Back to the board -
Fleet SentinelAt work
A predictive-maintenance layer for transit and municipal fleets. A failure model scores every component and rolls up to an asset health band; the system drafts the work orders and the federal asset-management narrative, matches grants to programmes, and answers questions through an agent with tools over the maintenance database.
- 5
- role views: executive, dispatcher, asset, compliance and grants
- 18
- tools the agent can call over the production data
- 65
- production tables ingested

The demo fleet is synthetic; the peer cohort comes from the federal transit database. Built with Single-file React dashboards; Python with DuckDB, Streamlit, Weibull survival models and LightGBM; an agent with tools; a GTFS-realtime poller writing to object storage.
Back to the board -
DOT concept prototypesAt work
Ten clickable concepts for federal transportation agencies, each one file. One Voice DOT is the real one: ask a travel question and get one plain-English answer with citations, pulled live from seven agency feeds. Evacuation Conductor orchestrates a multi-modal evacuation; a workforce twin simulates a retirement cliff; a response engine drafts cited answers to public requests.
- 10
- concepts, each opening as a single file
- 7
- federation adapters behind One Voice DOT, with a health probe
- 576
- timetable PDFs parsed into 364 trains and 49 routes for the rail answers

Evacuation Conductor. Every number on the screen is a scenario, not a real event. 
One Voice DOT. One question, one answer, every source cited. Built with Single-file React bundles for the concepts; One Voice DOT is Next.js 14, TypeScript and Tailwind with server-side adapters for each agency feed and an optional model step that rewrites the answer in plain English.
Back to the board -
Data Agents and LibrariesAt work
A catalogue of catalogues: every outside data source a team might need, found by parallel research agents and written into one 22-column record with a stable id. Transportation, test data, real estate, youth sports, fundraising and transit agencies, searchable in one offline page.
- 4,572
- records across 9 libraries2,340 data sources, 2,335 unique; the rest are directory records, counted separately
- 320
- sources gated behind an approval list; nothing gated was downloaded
- 65
- browser assertions pass, with contrast checked on 21 colour tokens in both themes

Every card says who publishes it, how often it refreshes and how to connect. Duplicates are kept and cross-linked, not deleted. Built with Python and Node build scripts; CSV and YAML as the source of truth; generated single-file dashboards, light and dark; a Playwright gate.
Back to the board
Everyday apps
Small products for real households and small teams, installable from a browser.
-
Fun Finder
Open funfinder.orgA nationwide search for things to do with your kids: sports, camps, parks and days out. Prices are shown only when they are known, accessibility filters are first-class, and children's profiles are nickname-only.
- 163k
- programs across every US state
- 1.13M
- parks, trails and places to go
- 4
- languages

funfinder.org. One developer, every state. Built with React and Vite; Cloudflare Pages Functions and D1 with spatial search; sitemaps generated at the edge; a Claude Haiku fallback for queries the parser cannot read; Node pipelines over OpenStreetMap, Wikidata, the National Park Service and Eventbrite.
Back to the board -
Receipt Snap
Open receipt-snap-efa.pages.devA household receipt app. Photograph the receipt, the amount and store are read for you, and the week's total and what is owed back are always one glance away. Unknown values are left blank rather than guessed.
- 234
- assertions across five phone sizes and two browser engines, zero failures

This week, at a glance. Built with A progressive web app on Cloudflare with Workers AI reading the receipts.
Back to the board -
ScanKit
An installable barcode and QR scanner for phones with four jobs: scan, keep an inventory, look an item up, and tick off a checklist. It runs from a browser and works offline once installed.
Not public yet.
- 4
- jobs, one install
Built with React and Vite; the ZXing decoder in the browser; a service worker for offline use.
Back to the board -
Fun Things database
A hand-verified set of at-home activities for kids, each with its source checked and a safety review. The build refuses to publish if any record breaks a rule.
- 134
- fields in the schema
- 177
- source links checked; 115 answered, 0 failed, the rest were not web pages
Built with Python; JSON shards compiled to JSON, CSV and a spreadsheet.
Back to the board -
File FinderAt work
A search page for a company's network shares. Staff type part of a file name and see which folder it lives in. The index holds metadata only, never a file's contents, and the whole thing is one HTML page that works offline with nothing to install.
Shown in words only: a capture would show the company's own file names.
- 180,788
- files indexed across 7 shares
- 0
- dependencies beyond Python's standard library
- 1
- file to open, about 13 MB, no server
Built with Python 3 standard library for the scan; one self-contained HTML page built from a template; a one-click refresh.
Back to the board -
Time KeeperAt work
A cleaner replacement for a weekly timesheet page. A keyboard-driven grid, a required reason for every logged hour, autosave with retry, a warning as a task nears its funded ceiling, submit and recall, and copy last week. On a phone it becomes a day view with voice-to-text for the reason.
- 1
- file to swap the demo data for the real timesheet API
- 2
- layouts: a desk grid and a phone day view

Demo data. Every entry needs a reason, and the balance column warns before a task runs out of hours. Built with React 18 and strict TypeScript; Vite with a single-file build; Cloudflare Pages.
Back to the board -
Narrated strategy deckAt work
A strategy presentation as one HTML file that narrates itself: slides, a guided tour, a narrator you can switch on, playback speed, and a menu, with the audio embedded so it opens anywhere with no player. Built to argue that a proposal should show the work instead of describing it.
An internal deck, so shown in words only.
- 1
- file with the slides, the narration and the tour inside it
- 10
- concepts argued end to end on one live pursuit
Built with A single HTML file with embedded narration; Python and Node for rendering, narration and screenshots; Cloudflare Pages.
Back to the board
Research
Pre-registered questions, locked holdouts, and results published whether or not they flattered the idea.
-
Universal car fob
A feasibility study for one key fob that works across several cars. Four architectures compared, nine decisions recorded, nine bench tests designed, and one open question that blocks the next step. Nothing has been bought and nothing is connected to a vehicle.
- 4
- architectures compared; one chosen
- $0
- spent
Built with Documents, with every claim pointing at a numbered source.
Back to the board -
Prediction-market bots
Paper-only bots that compare sharp sportsbook consensus with prediction-market prices and size bets by a quarter Kelly. They prefer no trade to a bad trade, and a separate study showed a language-model forecaster could not beat the crowd.
- 314
- tests across the two bots
- 11
- candidates from one scan of 643 markets
Built with Python and pytest. Live trading is disabled in code, not in a setting.
Back to the board -
Strategy Models
A multi-scanner paper trading system with hard caps, a market-breadth gauge and a review gate every backtest has to pass before anyone is allowed to believe it.
- 0.94
- correlation between the breadth gauge and the S&P 500
- 6
- model specifications, about 43 test files
Built with Python; daily market data from several providers; a local control room.
Back to the board
How I build
- A gate before a claim
- Every project has one command that proves it works, and the number it prints is the only number I quote. If the gate cannot fail, it is not a gate.
- Cite or refuse
- An assistant that cannot find the source says so. A price that is not known is shown as not known. Unknown is a value, never folded into a real one.
- Phone and desk, contrast checked
- Every screen is designed for the phone and the desk, with contrast checked by a script, not by eye. My products ship light and dark; this page is dark by choice.
- One file that works offline
- When someone has to open my work without me, it is one HTML file with no server, no install and no network. A 12.7 MB dashboard opens from a USB stick.
- Honest research
- Questions are registered before the data is read. Holdouts stay locked. The strategies that failed are published beside the ones that did not exist.
About
I am a builder in the Washington, DC area. My work sits where transportation, data and software meet: live vehicle tracking for small transit agencies, operations dashboards built on millions of public records, and AI assistants that answer with a citation or not at all.
I work the way an engineer should. Every project here has a verification gate, and the counts on this page come from those gates, with the date they were recorded. If a number cannot be re-derived, it is not on this page.
My products ship light and dark on every screen, I prefer one portable file that works offline, and I would rather show you an honest failure than a polished guess. The Research line is full of them on purpose.
Entries marked At work were built in my role at a consultancy, on public or synthetic data. Employer, client and prospect names stay off this page.