Projects

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.

  • Python
  • NiceGUI / Quasar
  • PostgreSQL
  • SQLAlchemy / Alembic
  • WebAuthn passkeys
  • Stripe billing
  • fpdf2
  • Docker
  • AWS EC2

evo-ai

Live · Ask AI v1

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.

  • FastAPI
  • LlamaIndex
  • Qdrant (hybrid)
  • fastembed
  • LiteLLM / Ollama
  • text-to-SQL
  • multi-tenant

evo.platform

Beta · Live

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.

  • API Design
  • NestJS / Node.js
  • Prisma
  • PostgreSQL (row-level isolation)
  • JWT + WebAuthn
  • Stripe billing
  • Docker

// 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.

  • Python (stdlib only)
  • SQLite
  • pytest / vitest / jest / Pester
  • Windows Task Scheduler
  • headless Claude triage

// 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.

  • TypeScript
  • Model Context Protocol
  • Playwright
  • FFmpeg
  • Neural TTS (Edge / Piper)
  • Claude Code skill
  • Vitest

// 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.

  • Next.js
  • evo-ai (RAG backend)
  • evo.platform SDK
  • NextAuth
  • Prisma / PostgreSQL
  • Tailwind
  • corpus parsing
  • citation gate

// 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.

  • Next.js / React
  • IronCalc (WASM)
  • Dexie / IndexedDB
  • ExcelJS
  • Prisma
  • PostgreSQL
  • Docker
  • AWS EC2

evo.docketmail

Alpha · In development

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.

  • React 19 / Vite
  • TypeScript
  • FastAPI
  • SQLAlchemy 2
  • PostgreSQL
  • evo.platform SDK
  • docxtpl / python-docx
  • openpyxl
  • Docker

// 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.

  • Python (no runtime dependencies)
  • Canon CCAPI
  • server-rendered HTML
  • works without JavaScript
  • Docker
  • Raspberry Pi target

// 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.

  • PowerShell

evo.locate

Live · Open source

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.

evo.snippets

Live · 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.

  • Python
  • TypeScript
  • vanilla JS

evo.packs

Live · Open source

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.

  • Python
  • corpus parsing

evo.confetti

Live · Interactive

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.

  • JavaScript (zero dependencies)
  • Canvas 2D
  • requestAnimationFrame
  • physics simulation

Self-hosted platform

Live

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.

  • Docker Compose
  • nginx
  • Let's Encrypt
  • AWS Route 53 / EC2
  • Postfix / Dovecot
  • Gitea
  • Prometheus
  • Grafana
  • Umami

evo.qaforaisystems

Case study

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.

  • Text-to-SQL validation
  • Retrieval eval harness
  • Guardrail regression suites
  • pytest
  • Ground-truth verification

Analytics dashboard

Live · Internal

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.

  • nginx
  • vanilla JS
  • Chart.js (self-hosted)
  • evo.locate (geo)

// Internal code — login-protected. Happy to demo it in an interview.

Want the whole picture? See my employment history, résumé, or get in touch — I'm available for new roles.