projects
Things I've built, from model routing and security tooling to products people pay for. Open source ones are marked.
Systems & open source
AI Query Router
OpenAI-compatible control plane for self-hosted inference. Routes chat, completion and embedding calls across Ollama, llama.cpp, vLLM and LM Studio backends by in-flight load, priority and EWMA latency. SSE streams pass straight through, with fallback right up to the first byte. Probe-driven health states, drain controls, SSRF-checked backend registration and a per-request routing audit trail.
Python · FastAPI · asyncio · httpx · Postgres · React
Palisade
Supply-chain and container security scanner built from entry-point plugins, 18 of them built in. OSV, GHSA and CISA KEV advisories sync into a local SQLite cache, so scanners never touch the network. Covers npm lockfiles, secrets, Dockerfiles, image layers (read via docker save, never run) and GitHub workflow posture, with SARIF 2.1.0 output and stable fingerprints.
Python · Pydantic · Typer · SQLite · SARIF · PyPI
tempwatch
Single-file bash monitor with no daemon. Discovers every hwmon sensor, NVMe drive and fan header from sysfs and lays them out in one to three columns to fit the terminal. Disks are read standby-aware, so sleeping drives stay asleep. Telegram alerts come from an atomic per-sensor state machine: transitions only, repeat alerts while critical, and fan-stop detection.
Bash · sysfs · hwmon · smartctl · Telegram
Telstar IRCd
IRC server written from scratch in Go. One actor goroutine owns all live state behind bounded queues with explicit backpressure, and a validate/commit split makes half-applied changes impossible by construction. TLS with hot-reloaded certificates, argon2id accounts over SASL, HMAC host cloaking and built-in services on SQLite. A native fuzz target guards the parser; about 260 tests run under the race detector.
Go · SQLite · TLS · SASL · argon2id · Go fuzzing
The Estate
The homelab this site runs on: one Proxmox host split into seven guests, 80+ containers on four Docker hosts, 50+ domains behind a single reverse proxy and a 104 TiB array. Telemetry comes from small collectors with atomic writes and read-only access, and uptime probes go through each public hostname, so DNS, TLS and the proxy are tested end to end.
Proxmox · Docker · nginx · NFS · Bash · Debian
NPM Analytics
Analytics built on the reverse proxy's own access logs, with no tracking script. An async ingester tails every host's log, enriches each client IP (GeoIP, ASN, reverse DNS) and classifies it as residential, datacenter, proxy or bot, so people and scanners are counted apart. 15M+ requests ingested, 90-day retention, a live WebSocket feed and a world map.
FastAPI · asyncio · SQLite · GeoIP · WebSocket · React
Products
Vinted Manager
Multi-user SaaS for Vinted sellers. Every AI call goes through one gateway that routes per feature, reserves the worst-case cost before the call and reconciles real token usage after. The model returns only schema-validated facts about the photos; deterministic code writes the NL/EN listing. Idempotent, leased analysis jobs on a credit ledger, a Chrome extension that pre-fills Vinted's form, and Mollie billing with idempotency keys.
Python · FastAPI · Claude · SQLite · Chrome MV3 · Mollie
Stockfolio
AI investing terminal and paper-trading research platform: 90k lines of async Python over 96 tables. Quotes flow through a tiered cache (process, Redis, one batched upstream call) behind Redis-shared circuit breakers, and dashboards are served stale-while-revalidate. LLM work is routed by priority between Claude and a local Qwen3-8B under admission control; a separate TimesFM 2.5 service handles forecasting.
FastAPI · Postgres · Redis · Claude · Qwen3 · TimesFM
Glide
Focus reader built on RSVP. Words are timed with punctuation-aware pauses and pinned on a computed focal letter, so the eye never has to move. White, pink and brown noise is synthesised live with the Web Audio API, no audio files. A server-side extractor runs Mozilla Readability on cleaned-up pages and gets past common cookie-consent walls.
Next.js · React · TypeScript · Web Audio · Readability
EmailBaseline
Email and DNS security audits: DMARC, SPF, DNSSEC, BIMI, MTA-STS, TLS-RPT, DANE and CAA in one pass. A lookalike scanner generates typosquat and homoglyph permutations and risk-scores each one, including its mail setup. DNS Guardian hunts dangling records: CNAMEs pointing at deprovisioned cloud endpoints, SPF chains into unregistered domains and orphaned NS and MX.
TypeScript · React · Vite · DNS · TLS
Efteling Hotel Scanner
Availability tracker for the Efteling hotels and restaurants. It polls every five minutes and texts subscribers the moment a cancellation frees a room or a table. Server-rendered landing pages carry schema.org data (Hotel, Offer, FAQ) for search, outbound bookings run through click-counted redirects, and one Express app serves two domains with canonical and hreflang tags.
Node.js · Express · SSR · schema.org · SMS
Themepark Tracker
Price tracker for Disneyland Paris packages: hotel plus park tickets for every arrival date at the cheapest available room, checked several times a day against the official site. A price calendar with a school-holiday overlay, live quotes for any party size or stay length, and price alerts.
Node.js · Express · Docker
Trendsites
Daily pipeline from Google Trends to live websites. Rising queries are scored against the existing competition, turned into AI-written, SEO-structured sites and deployed automatically. Work runs as Celery tasks on Redis, with separate environments deploying to Vercel and GCP.
Next.js · FastAPI · Celery · Postgres · Redis
Experiments
Kalshi Weather Bot
Autonomous trader for daily temperature contracts. A weighted ensemble of NWS, ECMWF, GFS and OpenWeather forecasts becomes a Gaussian with a time-to-settlement variance floor, and a trade needs model convergence, a fee-adjusted edge and enough book depth. Quarter-Kelly sizing, correlation-weighted exposure across cities, and a kill switch on losses, API errors or stale data.
Python · asyncio · SQLAlchemy · APScheduler · FastAPI
AI Stock Trader
Claude-driven paper trader inside Stockfolio. An eight-factor technical signal engine scores every symbol first, and only confident setups reach the model, which keeps token spend down. Calls run through a host-side bridge with a priority queue, crash recovery and a daily budget. Each decision is stored with its signals, reasoning, tokens and latency, and equity, drawdown and Sharpe are tracked daily.
Python · Claude · Qwen3 · Postgres · asyncio
BIMI Tracker
Measures BIMI adoption across the internet by watching certificate transparency logs for mark certificates. A Rust scraper follows the CT logs, a Go service parses the certificates, and a TypeScript API with a React dashboard serves the results from Postgres.
Rust · Go · TypeScript · React · Postgres
GitHub Secret Scanner
Watches public GitHub activity for leaked credentials, with detectors for 30+ key formats. Each hit is verified against the issuing service's API so only live keys are reported, then scored by severity and checked for bug-bounty eligibility, with results on a live dashboard.
Python · SQLite · GitHub API · Regex
Proxy Scanner
Async scanner for open SOCKS4, SOCKS5 and HTTP proxies across 70M addresses in 72 ranges. A bounded queue feeds up to 512 workers that probe each protocol in turn, with per-range checkpoints in SQLite. Hits are fingerprinted from banners and pages, then audited with Nmap's vuln scripts under a hard time budget; findings stream to a live dashboard over WebSockets.
Python · asyncio · Nmap · SQLite · WebSocket
Correlation Tracker
Tracks commodity, currency and equity relationships over rolling 30, 60 and 252-day windows. Z-scores flag when a correlation breaks from its historical norm, with Discord alerts and a colour-coded terminal dashboard.
Python · Flask · Yahoo Finance · SQLite