Public text-to-speech service
Go, Python, Redis, SQLite, nginx, Docker
A free web tool and API that reads text aloud in a range of classic speech synthesizer voices. It handles over a thousand requests a day, spread across two machines: requests go to a server node first, and a second node at home takes over when that one is unavailable.
- Rewrote the service from PHP to Go and moved traffic over one feature at a time. Each part ran alongside the old version and its responses were compared before it took real traffic, so users saw no downtime and no failed requests.
- Supporter API keys with daily quotas, and an admin panel that requires a passkey and an allowed IP address.
- Near-duplicate detection, so small edits to the same text don't use up a free user's daily allowance.
Self-hosted server and web infrastructure
Ubuntu, Docker, nginx, PHP-FPM, PostgreSQL, Cloudflare, Let's Encrypt
A Linux VPS hosting around thirty sites and services for me and a few friends, behind a reverse proxy and Cloudflare.
- Each remaining PHP site runs in its own process pool, user account and directory sandbox, so a flaw in one site can't reach the others.
- Moved most sites off PHP entirely after the PHP2Shell vulnerability went public, either to Golang or to pure, plain HTML static pages, to cut down the attack surface.
- Tuned Cloudflare's managed firewall rules after they started blocking legitimate traffic, and keep admin areas restricted by IP and passkey.
- Automatic certificate renewal, uptime monitoring and dashboards, and a site-wide maintenance mode that can be switched on with one command.
Online puzzle hunt
HTML, CSS, JavaScript, PHP
Co-created a multi-stage puzzle hunt with a small group: chained web puzzles with answers checked on the server, and a list of everyone who has solved each one.