Since 2013 I’ve worked across software engineering, web security, and production support; these days I build the unglamorous parts that make SaaS and commerce platforms trustworthy: backend systems, CI/CD, AWS infrastructure, observability, and the deploy pipeline itself. On the side I’m building wallflower, an open-source Go tool that finds the Prometheus metrics nobody ever asks to dance. I like systems that keep working after I hand them over.
- AWS
- Terraform
- Docker
- GitLab CI
- PHP
- Python
- TypeScript
- PostgreSQL
- Observability
Selected Work
08 entries Internal platform · owned end-to-end Docker, GitLab CI/CD, AWS (EC2/ECS), REST API, scheduled jobs
Customer-scoring platform
Support teams had no shared view of which customers mattered most. I built the system that scores and ranks them automatically, from an empty repository to production on AWS as the sole engineer: scoring engine, daily classification job, chat alerts, and a dashboard with preview mode so non-engineers could tune the thresholds themselves. Then I wrote the guide, trained the owners, and handed it over.
Testing & delivery Codeception, PHP, GitLab CI, Stripe & PayPal (test mode)
CI suite rescue
A large e-commerce platform’s daily end-to-end pipeline passed 4 of 24 jobs; a flaky, merge-blocking suite slows a whole team down. I rewrote the tests against the redesigned UIs, made data setup deterministic, fixed Stripe and PayPal checkout on ephemeral CI clones, and load-balanced the stage across parallel runners. 24/24 green, roughly twice as fast, and it stayed that way.
DevOps · AWS AWS (ECS, CloudFront, ECR), Ansible, GitLab CI, blue-green deploys
Zero-stale deploys
Every release left stale pages behind: app cache and CDN kept serving the old version. I added a post-deployment hook mechanism to the blue-green pipeline that purges caches and invalidates CloudFront on every release, eliminating that class of incidents entirely, and cut the pipeline’s retry storms and queue waits while I was in there.
Internal tooling · NestJS NestJS, TypeScript, REST, self-hosted YouTrack
Issue-platform automation extension
Workflow rules inside an issue tracker only go so far. I maintain a NestJS-based REST extension around our self-hosted issue-management platform, the automation layer the native rule engine can’t express (including the company-wide peer-review workflow), so process changes ship as code instead of manual policy.
Data & product engineering Python, SQL/Postgres, scheduled ETL
Funnel analytics dashboard
A customer-feedback email programme was running blind. I built the readout: a five-stage funnel (eligible → sent → clicked → rated → text) sliced by language, message type and experiment arm, fed by a daily job capturing data the source system didn’t record. Then I reshaped the metrics with the product owner until they answered real questions instead of reporting totals.
Open source · Observability Go, Prometheus/Mimir, Grafana API, OTel Collector, docker compose e2e
Metrics teams pay for thousands of series nobody looks at, because deleting any of them without evidence feels dangerous. wallflower audits what Prometheus or Mimir ingests against what Grafana dashboards and alerts actually consume, parsing every PromQL expression with Prometheus’s own parser, ranks the waste by cardinality and cost, and generates the drop rules to reclaim it. It runs as a CI gate that only fails on regressions and renders a self-contained HTML report; a deterministic Mimir + Grafana demo stack doubles as the e2e fixture, so CI asserts the audit finds exactly the planted waste.
Open source · Go Go, Postgres + pgvector, OpenAI, Docker
A Go CLI that analyzes public business white papers for repeated pain points and ranks SaaS opportunity candidates with citations back to the sources: a 13-stage pipeline across discovery, ingestion, embeddings and LLM analysis. Deliberately compliance-first: respects robots.txt, never bypasses paywalls, stores summaries rather than documents.
Open source · Admission control PHP, MySQL (GET_LOCK), REST, Playwright e2e, Docker, GitHub Actions
Load shedding at the application layer: cap how many visitors browse at once and queue the overflow first come, first served, with live positions and automatic admission. The core is atomic admission under a MySQL named lock, designed to fail toward the queue and never past the cap, plus an e2e suite proving that a burst of 20 parallel visitors at a limit of 5 yields exactly 5 admissions. Rebuilt in 2026 from my 2023 version; the repo documents every original defect and its fix. Ships as a WordPress plugin.