I build small, self-contained software — local-first AI tools, web services, and games. Most of it runs offline on one machine with no paid APIs. A selection is below.
Screenshots are from the live apps running locally. Code links go to GitHub where public.
$ curl -s :5000/chat -d '{"message":"what are the recycling hours"}'
{
"action": "answer",
"intent": "RECYCLING_HOURS",
"confidence": 1.0,
"text": "The Knox County Recycling Center is open
Monday through Friday, 8 AM to 5 PM...",
"reason": null,
"latency_ms": 812.4
}
$ curl -s :5000/chat -d '{"message":"appeal my property tax"}'
{ "action":"escalate", "reason":"hard_rule: tax appeals",
"text":"Let me connect you with a representative." }An on-prem phone-answering AI for a county government, built to decline rather than guess. The language model does exactly one job — classify a caller's words into a closed set of intent IDs. Any ID it invents is rejected; the spoken answer is returned verbatim from the knowledge base, so a 3.8B model can't invent a permit fee.
Three independent gates decide whether to answer at all: hard keyword escalation rules that run before the model, closed-set validation, and a confidence floor that blends the model's self-reported score with lexical overlap. Below 0.55 the call goes to a human. Ships with a 26-case regression battery.

Ask questions about your own documents, fully offline against a local Ollama model — nothing leaves the machine. Hybrid semantic + keyword retrieval, per-document profiling (names, headings, length) so whole-document questions are answerable, and a router that decides whether a question is about a passage or the whole document.
v2 wraps the engine in a FastAPI service: HTTP upload, SQLite with full CRUD and metadata, persisted query history, API-key auth, optional TLS, and 158 automated tests.

A place to build many small tools and reach them from any device — phone, laptop, a machine you remote into — over a private network with nothing exposed to the internet. Three layers, each doing one job: Tailscale is the network and identity, Caddy is the router, systemd is the lifecycle. Individual tools stay ordinary local web apps that know nothing about any of it, so moving the whole thing to a real server later is a copy of one directory, not a rewrite.

A retrieval-augmented chatbot over the county knowledge base — permits, property assessment, county commission, services. Page ingestion extracts main content as markdown, chunks it with heading context preserved, embeds each chunk locally with all-MiniLM-L6-v2, and stores vectors in PostgreSQL / SQLite. Retrieval-only by default; generation is opt-in.

A shared file inbox between phone and computer — drop a file on one device, grab it on another, over the private Tailscale mesh. Built as a Toolhub tool: a single app.py, no database, dropped into the hub and picked up automatically.
A dozen single-file HTML5 math games for kids — big cartoon characters, particle bursts, combo systems, speed bonuses. All playable in the browser.