Home/Work

Systems I’ve shipped end-to-end.

Design, build, evals, deploy. Each of these runs in production and earns its place. Client names and proprietary details are generalized, the engineering is real.

Eight builds, each shaped around a real job.

The pattern repeats: find the outcome, prove a thin slice fast, gate it with evals, then make it boring to run.

Local AI companion

A private assistant that runs entirely on-device

A voice-and-text companion with persistent memory and an event-driven core, built local-first so conversations never leave the machine.

The problem

Hosted assistants are useful but leak everything you say to them, bill per token, and stall the moment connectivity drops. A genuinely personal assistant has to be private and always available.

What I built

An event-driven core with intent routing, persistent cross-session memory, and a pluggable LLM backend running on local hardware, with graceful fallback when a model is busy, so it never hard-fails mid-conversation.

Stack

Ollamaevent busintent routerpersistent memoryPython
0
tokens to cloud
<1s
wake-to-reply
100%
on-device
Fleet telematics product

A fuel & fleet command center with live alerts

Real-time tank levels, route-aware mileage, fuel-type tracking and theft alerts. Raw field telemetry turned into decisions an operator can act on at a glance.

The problem

Fleet data arrives noisy, out of order, and spread across devices. Operators were reading spreadsheets after the fact instead of catching a fuel-theft event or a stranded vehicle while it mattered.

What I built

A streaming ingestion path that normalizes telemetry and surfaces it as a single operations dashboard, with four classes of live alert wired to the events that actually need a human. A dark-satin UI tuned for an at-a-glance read.

Stack

streaming ingesttime-seriesreal-time alertsops dashboard
live
telemetry feed
4
alert classes
1
pane of glass
Inbox triage agent

An agent that reads, classifies and drafts, locally

A scheduled Gmail triage system that sorts, prioritizes and pre-drafts replies on a local model, with a human-in-the-loop gate before anything sends.

The problem

Inbox volume eats the first hour of every day, and the obvious cloud fix means handing your entire mail history to a third party. The triage had to be smart and stay on the box.

What I built

A timer-driven agent that classifies and prioritizes mail and pre-drafts replies on a local model, gated behind explicit human approval before anything sends. Covered by a regression suite so a prompt tweak can’t silently mis-route mail.

Stack

Gmail APIlocal LLMschedulerhuman-in-the-looppytest
69
tests green
daily
scheduled runs
$0
per-run cost
Knowledge-graph memory

Cross-session memory as a queryable graph

A persistent memory layer that turns code, docs and notes into a knowledge graph of concepts, connections and source links, so an agent can answer “where does X live” before it ever greps.

The problem

Agents forget everything between sessions and re-derive the same project structure over and over, burning context and time on searches they’ve already run.

What I built

An extraction pipeline that maps a repo into a graph of concepts and connections with source links, exposed through query, path and explain tools, and rebuilt automatically on every commit so the map never drifts from the code.

Stack

graph extractioncommunity detectiongit hooksquery / path / explain
700+
concepts mapped
auto
rebuild on commit
0
cloud calls
Text-to-CAD agentic loop

Plain English in, a printable parametric part out

A fully-local agentic loop that writes parametric OpenSCAD from a natural-language description and self-corrects until the geometry is right.

The problem

Describing a simple part is easy; modeling it correctly is not. A one-shot code generator gets the dimensions subtly wrong and has no way to notice. The loop needs eyes and a way to retry.

What I built

A local codegen model writes OpenSCAD, the CLI renders it, and a vision model inspects the render against the request, feeding corrections back until the part passes. No cloud, no API spend, deterministic to re-run.

Stack

Ollama codegenvision inspectorOpenSCAD CLIself-correction loop
closed
codegen → inspect loop
local
only, no cloud
.stl
print-ready out
Evening intelligence brief

Many feeds in, one readable brief out

An evening email that consolidates thousands of items across many intel streams into a single, sixth-grade-readable brief, so the day’s signal arrives in one place instead of flooding the inbox.

The problem

A dozen feeds, newsletters and alert streams produce noise faster than anyone can read it. Most of it is irrelevant, and the important few items drown.

What I built

A scheduled pipeline that pulls every stream, ranks and de-floods the items, and synthesizes one consolidated brief in plain language on a local model, delivered as a single 6 PM email instead of all-day interruptions.

Stack

feed aggregationlocal synthesisranking / de-floodscheduled email
2,500+
items / day in
1
email out
6th-grade
readability
Self-hosted media library

A private replacement for cloud photo & drive storage

A self-hosted photo and media library: the parts of cloud photo storage worth keeping, running on your own hardware with nothing leaving the building.

The problem

Cloud photo and drive services are convenient until they raise prices, change terms, or hold your whole archive hostage. The data is personal and shouldn’t live on someone else’s server.

What I built

A self-hosted library with ingest, organization and browsing over a personal media archive, built local-first so it runs entirely on owned hardware: convenience kept, the landlord removed.

Stack

self-hostedmedia ingestlocal storagezero egress
self
hosted, owned
0
cloud dependency
private
by default
Per-company support assistant

Customer support that answers only from your docs

A support assistant that grounds every reply in a company’s own help articles, footnotes the source, wears the company’s brand, and hands the hard cases to a human, on a local model.

The problem

Most support bots invent policies, leak conversations to a third party, and bill per token. A bot customers can trust has to answer from real documents, show its sources, and know when to stop.

What I built

A per-company profile (one company.yaml: branding, scope, escalation rules, knowledge base) over a local RAG service. Each business gets a grounded assistant that cites the exact article, escalates on its own triggers, and drops into any site as a Shadow-DOM widget. New company in, no retraining.

Stack

OllamaChromaDBMiniLMFastAPIRAG + citationsShadow-DOM widget
live
demo, try it
100%
answers cited
$0
per-token cost

Have a model-shaped problem? Let’s make it ship.

Tell me the outcome you’re after. I’ll tell you what’s buildable, what it takes, and where the model actually helps.