Production software I designed, built, and operate end-to-end. QA on
Autodesk Maya and 3ds Max taught me exactly how software breaks — this is what I build when I own the
whole stack, from schema to server. Every project below is live. Click through and use it.
Sign in to any of the apps as demo@evomedia.net — ask me for
the password and it is yours. The open-source tools need no login at all.
evo.ehs
Beta · Live demo
Multi-tenant SaaS for environmental, health & safety compliance at multi-plant manufacturers.
Tracks permit deadlines and evidence, manages incidents and corrective actions, runs OSHA
incidence-rate reporting, and auto-discovers facility data straight from EPA and Texas TCEQ
databases — with per-site live weather and NWS alerts. Passkey sign-in, Stripe subscription billing, and
generated PDF reports.
A multi-tenant Retrieval-Augmented Generation (RAG) platform I designed and built — it turns an
organization's own records into a grounded, guarded, cited assistant that answers only from those
records and declines everything else. Model-agnostic per tenant, private-capable, and deployed in
production as the "Ask AI" capability inside evo.ehs.
The multi-tenant foundation beneath these apps: shared authentication, per-tenant data isolation
at the row level, and an API designed from the ground up as the platform's core — not an add-on
bolted to an existing app. A common SDK means a new product ships in days instead of months.
Three products run on it as tenants today — evo.provensheet, evo.civilcode and
evo.docketmail. The source is public, MIT licensed, and includes the Next.js starter
template a new tenant is scaffolded from.
// No public sign-up — it serves the three products above. The source is the walkthrough.
evo.testsuites
Live · Internal
Every test suite in every project on this page runs once a day, and every individual test is
kept — not just the totals. A street light reports the fleet at a glance (green only when
the worst suite is at 90% or better), the chart tracks the daily average pass rate, and each
suite carries its test count, 14-day and lifetime averages, and an expander listing every test
pass or fail. A failing suite writes a dossier and hands it to a headless Claude session that
files the bug and opens a fix PR — it never merges one.
// Built after a fortnight where two suites read “failed” from a broken measurement, not broken code. A daily full run is the difference between knowing and assuming.
evo.videostroll
Beta · Open source
An agent that records a narrated walkthrough video of a website — driving the
browser itself, speaking as it goes, with a visible cursor and timestamped captions. It ships as two
halves: an MCP server any agent can call, and a Claude Code skill that carries the method —
read the page first, storyboard it, narrate in short presenter sentences, then read the manifest back
and check the words match what was on screen. One run produces the video, the subtitle files, a
manifest timestamping every step, and the storyboard that reproduces it.
// The video above is its own output — a tour of its documentation, recorded, narrated and captioned in one pass. Nothing edited afterwards.
evo.civilcode
Alpha · In development
Ask the Texas statutes a question and get an answer grounded in the statutes themselves — every
response cited to a specific section, with its hierarchy, the passage it came from, a deep link to the
official text, and the snapshot date. A second evo-ai RAG product: the
complete statutory corpus retrieved from the official Legislative Council source, parsed into clean
sections, and answered by a local model so nothing leaves the box. Guardrails are the
product — it tells you what the law says, never what to do.
// Beta — retrieval verified by a 30-question citation gate before the product shipped.
evo.provensheet
Alpha · In development
Turns the spreadsheet a business actually runs on into a shared web application — and
proves the numbers survived. Drag in an Excel workbook and it is a working cloud app
seconds later: formulas, not screenshots. Every formula is then recomputed and compared against the
result Excel itself cached in the file, so you see cell-by-cell that the maths is intact before
anyone relies on it — the report is the product, where everything else in this space asks you to
trust the conversion. Multi-user and local-first, so edits survive a dropped connection and sync
when it returns. The built-in sample is an 18-sheet industrial estimating workbook refined over
30 years of in-field use: 5,121 formula cells, all matching.
Automated court-record monitoring for Southeast Texas. Scheduled pipelines pull new filings, a React
front end filters and selects them, and the matching direct-mail pieces are generated as merged Word
documents ready for print. Built on evo.platform through its SDK — one of the three products running
on it as tenants.
// Public records only — nothing sealed, nothing confidential, nothing bought.
evo.ablecamera
Alpha · Live demo
A Canon EOS control surface for photographers with limited hand mobility or fine motor control.
I am user zero for it, so the constraints are measured rather than imagined. Canon’s own apps
quietly require a steady hand: small targets, drag-to-set dials, press-and-hold gestures. Miss any
one of those and the camera is not partly usable, it is not usable. This one is driven entirely by
keyboard, switch, voice or dwell input, with no gesture anywhere in it that needs precision or a
sustained hold. Live view off an EOS R50 working on 14 September 2026.
// The repository is private while the hardware work settles; happy to walk through it.
evo.zscripts
Live · Open source
Open-source CLI built for AI-assisted development — one-word commands (zstart,
zdeploy, zbackup) that wrap the routine start / deploy / backup chores
so a coding agent doesn't have to reason through them. It saves tokens, but the real win is
keeping the AI's context window focused on the actual work. The tooling I use to run everything
on this page.
Self-hosted IP geolocation API — no account, no API key, no per-query cost, and no
visitor IP ever leaves the machine it runs on. It returns the same JSON field names as
ip2location.io's free tier, so it drops into anything already written against that API by repointing
the URL. Data comes from DB-IP's free Lite databases, held locally and refreshed monthly by the
service itself.
Python
FastAPI
DB-IP Lite (MMDB)
Docker
pytest
// Built while evaluating the paid options. If it drops a third-party dependency, keeps user data private, or cuts a recurring cost, I build it — this one does all three. Ran in my own apps first, then went open source.
Small, self-contained tools that each solve one problem and run anywhere —
a folder you copy into a project, or run in place against any codebase. No install step, no
framework, nothing shared between them. Two so far.
find-oversized-input-limits reports every declared user-input character limit
above a threshold across twelve stacks — HTML, React, Angular, Django, Pydantic, Zod,
Laravel, Rails, Go, Spring, .NET and SQL — the field that accepts 10,000 characters because
nobody set a bound. Its Python and TypeScript implementations are byte-identical twins: same
flags, same exit codes, same output, so you run whichever runtime the machine already has.
confetti-burst is a confetti effect that falls like paper rather than sparks,
with air drag and tumble-driven flutter, from a single HTML file with nothing to serve.
A pipeline that turns a body of content into an installable pack —
collect, extract a text layer, OCR whatever has none, index, build, catalog, then re-check the
source for anything that changed since capture. The packs that exist today are regulatory, built
for the EHS product — OSHA, EPA, DOT hazmat and NFPA public material — because that is what an
air-gapped install needs in order to answer a question that is not about the customer’s own
records. Nothing in the pipeline is tied to a subject or a file type: a pack can hold
anything.
Source documents never enter git: roughly 33 GB in, 1.2 GB of text out, embedded at
install time on the customer’s own instance.
Built because I needed a confetti system and was sure I could do better than what was
available. Most effects throw dots along a ballistic arc, so they read as sparks. Paper is
nearly all surface and almost no mass — it sheds its launch speed in a fraction of a
second, then descends slowly, fluttering. This models that: air drag, tumble-driven flutter,
and a numpad grid of twenty-five firing positions. One file, no dependencies, no build step.
Headed for open source.
Everything here runs on infrastructure I built and operate end-to-end: a single nginx edge routing
every site, containerized services, self-hosted email, Git, and full metrics and dashboards — on one
AWS box, no managed PaaS. When something breaks at 2 a.m., I'm the one who fixes it.
Systematic QA / SDET practice applied to a production LLM platform I designed and built — a documented
defect loop against text-to-SQL, retrieval, and guardrail failure modes. Every bug tracked with a
reproduction, root-cause analysis, a regression test, and verification against database ground truth.
Self-hosted visitor analytics for every site on this page — sessions, page views by path, status-code
distribution, and per-visitor IP geolocation answered locally by
evo.locate on the same box, so visitor data never goes to a
third-party service. A single HTML dashboard served directly by the nginx edge, parsing its own
access logs.