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

ML systems2026

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 security2026open source

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

Ops tooling2026open source

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

Networking2026

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

Infrastructure2026

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

Observability2025

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

Screenshot of Vinted Manager

Vinted Manager

AI SaaS2026

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

Screenshot of Stockfolio

Stockfolio

AI research platform2025

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

Screenshot of Glide

Glide

Reading app2026

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

Screenshot of EmailBaseline

EmailBaseline

Email & DNS security2025

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

Screenshot of Efteling Hotel Scanner

Efteling Hotel Scanner

Real-time2025

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

Screenshot of Themepark Tracker

Themepark Tracker

Price tracking2026

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

AI automation2025

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

Prediction markets2026

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

LLM agents2025

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

Security research2025

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

Security2025

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

Network security2025

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

Quant research2025

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