What I've Built · Western PA

Self-hosted software, AI systems, and live products — built and operated end to end.

Over the past several months I've designed, built, and shipped everything below — from real e-commerce stores taking live payments, to a private AI research platform and media library, to the server infrastructure it all runs on. One rented dedicated server, a home GPU rig, and a lot of shipped code.

Nearly everything here is self-hosted: I run the servers, the databases, the reverse proxies, the mail, the backups, and the deployments myself.

Flagships

The systems that anchor everything else: a private AI research platform, an AI media library that grew out of it, and a real-time platform for experiencing that media together.

The AI Research Stack Live

A complete, private alternative to Big Tech's AI cloud — search, chat, memory, and automation, all running on hardware I control.

Before Zeus existed, I built the platform it stands on: a fully self-hosted AI research environment where every query, document, and conversation stays on my own servers. It's the kind of stack most people rent from Google, OpenAI, and Notion — except here every piece is open-source, wired together by hand, and gated behind my own single-sign-on.

  • Private AI search — an AI research assistant (Perplexica) backed by a self-hosted metasearch engine (SearXNG), so deep research runs without sending queries to a tracked search provider.
  • Local LLM chat — OpenWebUI backed by Ollama running open-weight models on my own GPU, plus a LiteLLM gateway that routes to commercial models when a job needs more horsepower.
  • Memory & retrieval — Qdrant vector database and Meilisearch keyword engine as shared retrieval infrastructure; a self-hosted Firecrawl cluster turns any webpage into clean, AI-readable text.
  • Automation — n8n workflows connecting the pieces, with Langfuse for LLM observability and evals: every model call traced, scored, and costed.
  • The supporting cast — Nextcloud (files), Linkwarden (bookmarks/archive), Kopia (backups), Filebrowser, and Authentik single-sign-on wrapping the whole suite in one identity layer.

This stack is what makes the rest of the portfolio possible: the book translator borrows its vector memory, Zeus grew up on its retrieval engines, and every project gets model routing and observability for free. It runs 24/7 on my primary VM and has for months.

Perplexica + SearXNGOpenWebUI + Ollama LiteLLMQdrantMeilisearch Firecrawln8nLangfuse Authentik SSONextcloudDocker

Zeus Live

A private, self-hosted AI media library — rip it, transcribe it, index it, then ask it questions.

Zeus ingests almost anything — YouTube videos, podcasts, PDFs, EPUBs, web articles, voice memos, even live streams — transcribes audio on a local GPU, and indexes every chunk into both a semantic vector store and a keyword search engine. You can then ask the whole library questions in plain English and get answers with citations that jump to the exact audio timestamp or book paragraph.

  • Investigative tools — entity extraction, timelines, co-occurrence graphs, and cross-source contradiction detection, where every claim must trace back to a real source or it's dropped.
  • Studio — cuts clips, supercuts, captioned GIFs, and loudness-normalized soundbites, with an LLM judge loop checking the output.
  • Knowledge layer — highlights, notes, spaced-repetition flashcards, template-driven document generation, and a morning briefing digest.
  • Live capture — a DVR-while-live pipeline that mirrors HLS streams as they air, with a headless-browser fallback when direct capture is blocked.
  • Voice — a voice-agent pipeline (voice activity detection → speech-to-text → tool loop → text-to-speech) for talking to the library hands-free.
  • MCP server — 37 safety-classed tools behind OAuth 2.1, so external AI agents (like Claude) can query and enrich the library without ever touching destructive operations.

The architecture is split across two machines: the server VM runs the API, search, and studio, while a home GPU rig does the heavy lifting — WhisperX transcription, PDF-to-markdown conversion, audio stem separation, OCR — coordinating over a job-lease heartbeat protocol so either side can fail without losing work. Built and verified through eleven development phases.

Python / FastAPIWhisperX on GPU QdrantMeilisearchPostgres + Redis LiteLLM gatewayMCP + OAuth 2.1ffmpeg Vanilla JS frontend

SRM Live

Self-hosted voice, text, and watch-together rooms — like a private Discord with perfectly synced playback.

SRM is a real-time platform built on WebRTC for hanging out in rooms: voice chat, text chat, and — the part that makes it special — a co-presence engine that keeps video playback in sync for everyone in the room. It integrates directly with Zeus, so a film from the media library can be watched together, with everyone's player locked to the same frame, while talking over it in voice.

  • Real-time media core — LiveKit handles WebRTC signaling and voice; a media server pipes synchronized video into rooms.
  • Bot tier — a programmable bot joins voice rooms with text-to-speech and a soundboard.
  • Multi-instance design — one identity home with satellite instances on other VMs, sharing single-sign-on, each running its own full stack.
  • Monorepo architecture — web, server, and bot apps with shared types, deployed via per-VM Docker Compose behind the edge proxy.

It runs in production today across two VMs on my infrastructure — including a dedicated private backend VM reachable only through the reverse-proxy front door.

TypeScriptReactFastify LiveKit / WebRTCMediaMTX Postgres + RedisDocker

The Infrastructure Underneath

Everything above runs on systems I administer myself.

One Server, Seven Machines

A rented dedicated server carved into a fleet of purpose-built virtual machines.

The foundation is a single dedicated server running the Proxmox hypervisor, divided into seven VMs, each with one job: a primary application box (the AI research stack and Zeus), a hardened commerce-and-mail box that runs the live stores, a thin reverse-proxy edge, dedicated site and real-time-media VMs, and an isolated box for the collaborator project. Memory is deliberately overcommitted and balloon-tuned across the fleet, with capacity decisions — which VM gets RAM, what gets powered down to free it — made and documented like a small ops team would.

Proxmox VEKVM ballooningDebian/Ubuntu guests

The Edge: One Front Door

A single public IP fronting a private network — new sites cost nothing to launch.

Public traffic enters through one thin edge VM running Caddy, which terminates TLS with automated Let's Encrypt certificates and reverse-proxies to backend VMs that live on a private bridge with no public IP at all. The edge also NATs the backends' outbound traffic, so a new site or service costs zero new IP addresses: add a DNS record, add a proxy block, done. Sensitive workloads that need their own identity — the mail-carrying commerce box, the isolated collaborator box — keep dedicated public IPs instead, each bound through the host's virtual-MAC routing.

CaddyLet's EncryptPrivate bridge + NAT Failover IP / vMAC routing

Mail, Identity & Security

The parts most people outsource first.

I run my own mail server — DKIM-signed, deliverability protected by giving it its own dedicated IP away from experimental workloads — handling real customer order mail for the stores. Identity across the AI stack is centralized in self-hosted Authentik single-sign-on, with services gated at the proxy layer so nothing private is reachable without auth. Management access rides a Tailscale mesh VPN rather than open SSH ports, exposed services are minimized, and the boxes that need hardening get fail2ban and unattended security upgrades.

docker-mailserverDKIM / deliverability Authentik SSOTailscalefail2ban

The Home GPU Rig

A consumer GPU workstation doing the compute the cloud would charge dearly for.

The server fleet handles serving; the heavy AI compute happens at home on a GPU workstation. It runs the Zeus worker — WhisperX transcription, PDF-to-markdown conversion, audio stem separation, OCR — pulling jobs from the server over a lease-and-heartbeat protocol, so the rig can go offline without losing work and the server never depends on it being up. The same rig hosts local LLM inference (Ollama and LM Studio serving open-weight models), a hardened sandboxed model container, the model-swap proxy, and the AI video-generation experiments. The split keeps monthly server costs flat: rent cheap CPUs for uptime, own the GPU for the expensive work.

RTX GPU workstationWhisperX Ollama / LM StudioJob-lease protocol Docker sandboxing

Backups & When Things Break

Nightly full-fleet backups to hardware I own — and honest post-mortems.

Every VM backs up nightly to a Proxmox Backup Server running on a repurposed laptop at home, reached over the VPN mesh — an off-site copy of the entire fleet, on hardware I physically control, with the job configured to auto-include any new VM. When things break, they get real incident response: the morning the backup server fell into a crash-loop, the root cause (a permissions bug on a temporary filesystem) was diagnosed, fixed, and written up as a post-mortem the same day. The known weaknesses — single disk, no second off-site copy — are documented too, because pretending otherwise is how data gets lost.

Proxmox Backup ServerNightly snapshots Incident post-mortemsRepurposed hardware

Live on the Internet

Real sites with real users — payments, fulfillment, mail, and analytics all self-operated.

Western PA Photos Live

Fine-art print store for Western Pennsylvania photography.

A full e-commerce storefront selling framed, canvas, and unframed prints (plus mugs and cards) from ~90 original photographs. Customers get a per-photo crop tool, size options filtered by print quality, and Stripe checkout; orders flow automatically to a print-on-demand partner with a cash-flow gate so nothing goes to production before funds settle. Margin tracking, discount codes, transactional email, and an admin console — all built from scratch.

Next.js / TypeScriptPostgres StripeGelato print API Self-hosted mail (DKIM)Docker

Kindred Spirit Live

Tribute archive + merch shop for a Johnstown, PA rock band.

A multimedia archive for a 1960s–2000s local band: history and timeline, member bios, digitized cassettes and reels with in-page audio players, reunion video, podcast interviews, and a moderated fan memory wall that accepts photos and voice memos. A built-in merch shop sells shirts and mugs through Stripe with print-on-demand fulfillment. Backend services are small Python daemons I wrote — contact, cookieless analytics, memory moderation, and order handling.

Static HTML/CSS/JSPython stdlib services Stripe + GelatoSQLiteCaddy

westernpa.dev — Demo-Site Factory Live

Free spec-work websites for underserved Western PA small businesses.

A pipeline for researching local businesses with no (or bad) web presence, building them a fast, clean demo site, and publishing it at its own subdomain as an opener for outreach. Includes a photo-optimization toolchain, a researched prospect database of ~200 verified local contacts, and repeatable one-shot site builds.

Static sitesBash tooling Caddyrsync deploys

GardenCam / Garden Overwatch Live

Old Android phones turned into a self-hosted garden surveillance system.

I wrote a native Android camera app that streams live video from repurposed phones into a self-hosted NVR with AI motion detection. The first-generation app runs on a Moto G5 Plus watching the garden right now; a second-generation port for a Pixel 4a includes a fully spec'd Power-over-Ethernet build for permanent outdoor mounting.

Kotlin / AndroidH.264 / RTSP Frigate NVRPoE hardware build

churnthemane — GIF Vault Live

Public gallery of watermarked GIFs cut and published straight from Zeus.

The public monetization surface for the Zeus studio pipeline: a static gallery of captioned, watermarked GIFs with a lightbox viewer and copy-ready direct links that play inline on Discord and Telegram. First-party, cookieless analytics (self-hosted SQLite + GeoIP) — no third-party trackers.

Static + vanilla JSSQLite analyticsGeoIP

20 AI Projects Live

A standalone showcase app of AI experiments.

A self-contained Next.js application collecting a set of smaller AI builds in one place, running as its own service on my infrastructure.

Next.jsDocker

Platforms & AI Engineering

Bigger systems and the tooling that makes AI actually useful day to day.

Magister Forge Live

A research harness where the toolchain — not the AI — decides whether code is correct.

An experiment in trustworthy AI coding: a deterministic plan → implement → verify loop where the language models have no authority over correctness. Tests are authored blind, validated against planted pass/fail fixtures before any live run, and a cross-family judge model is only allowed to rule on what the test attestations already prove. Three complete projects were built end-to-end through the loop as proof, driven from a web interface I built for it.

Python orchestratorFastAPI Multi-model routingMutation testing Sandboxed executor (LXC)

Forensic Harvester Advisory Role

Industrialized reading of SEC filings — securities-fraud signals turned into evidence someone else can act on.

Securities fraud leaves a paper trail in EDGAR, but it hides in the filings nobody reads. Forensic Harvester reads them at scale: a zero-cost deterministic screen sweeps thousands of companies (2,300+ in one sweep) using only free SEC data — no API keys, no AI spend — and only the leads that survive triage ever touch a language model. A three-axis scoring engine separates procedural manipulation from accounting strain from ordinary distress, so honest strugglers don't get ranked like frauds.

  • It grades itself against the SEC's answer key. The manipulation axis was audited against the SEC's enforcement corpus — and failed. That failure was published, the axis re-specced around procedural signals, and revalidated on a true holdout (AUC 0.759; 73% recall of enforcement cases a full year early; 92% gate precision).
  • Truth-guard layer — a deterministic citation verifier quote-matches every claim against the primary filing by accession number; analysis carries epistemic badges (confirmed / inferred / speculative / contradicted), and negative assertions require disconfirming-search receipts.
  • Four exit lanes — a verified investigation can leave as an SEC whistleblower referral packet, litigation support, journalism, or trading research.
  • Breadth — EDGAR full-text and XBRL data, plus OSINT reach across court records, corporate registries, sanctions lists, offshore-leaks databases, and regulator feeds; 9 analysis modules, 117 API endpoints, 86 offline tests, multi-provider LLM routing with circuit-breaker fallback.

My role was advisory: system architecture, the evidence-spine design (no claim survives without backing evidence), and infrastructure and deployment guidance. I wrote none of the application code — the build credit belongs to my collaborator, and it runs in production on an isolated VM in my fleet.

Architecture & guidanceSEC EDGAR / XBRL Deterministic screeningCitation verification Multi-LLM gatewayDocker

French Book Translator In Use

Whole-book French→English translation with a consistency memory.

Splits a French book into segments, translates them through a large language model, and keeps a vector-database "translation memory" so terminology stays consistent across chapters. Fully resumable, parallelized from an 8-hour sequential run down to about an hour, and finished chapters upload themselves to my cloud with shareable links. Currently working through a real book.

Python / asyncioMistral API QdrantNextcloud API

Model-Swap Rig In Use

One-click switching between AI providers for my coding agent.

A local LLM proxy running as a system service that lets my coding agent swap between DeepSeek, Kimi, Mistral, or a fully local GPU model with a single click from a desktop GUI I built — including a card that drops everything back to the default provider. Alongside it: a curated meta-prompt library with a production evaluation pipeline, and a hardened sandboxed container for running open-weight models locally on my GPU.

LiteLLM proxysystemdTk GUI Ollama + local GPUPrompt evals (Langfuse)

Legal AI Skill Suite Port

150 legal-practice AI skills ported to a self-hosted agent harness.

Ported Anthropic's open-source legal skill suite — 12 practice areas from commercial contracts to litigation to AI governance — onto a different self-hosted agent framework, rebuilding the skill-routing layer so all 150 skills auto-discover and route correctly, with role gating and per-team practice profiles.

Agent skillsPrompt engineeringHarness integration

BioCLIP Species Identifier Experiment

Point a photo at it, get the species.

A working wrapper around the BioCLIP vision model that identifies plants and animals from photos, with both a command-line mode and a drag-and-drop web interface, running on my own GPU.

PyTorchGradioVision transformers

Hardware & Tinkering

Old devices given new jobs, and experiments on the home GPU rig.

Pocket Media Ripper (LG V30)

A retired phone rebuilt into a universal media downloader.

An old LG V30 running a terminal environment with a share-sheet hook: tap "share" on almost any video link on the phone and it downloads locally — including sources protected by bot checks, handled via TLS impersonation and token solving. Entirely offline-first once media is saved.

Termuxyt-dlp + curl-cffiffmpeg

Local AI Video Experiments Ongoing

Video stylization and generation benchmarks on consumer hardware.

Testing how far an 8 GB consumer GPU can be pushed for AI video work: running diffusion video models locally to restyle footage into a 1970s comic-book look, benchmarking VRAM use and generation times, and documenting what works at this hardware tier.

Stable Diffusion XLWan2GP / VACERTX 5060 Ti

Isometric Tactics Engine In Progress

A turn-based tactics game in the spirit of Final Fantasy Tactics.

A 2D isometric battle engine with initiative-queue turn order, elevation-aware pathfinding, data-driven abilities, and enemy AI — architected so the entire game core runs headless under automated tests, with rendering kept as a thin layer on top.

Godot 4GDScriptHeadless test harness