I build things and then try to make them hold up under scrutiny — automated tests, clear documentation, and CI that actually runs.
Most of what I work on sits somewhere between backend services and test tooling: APIs, data-heavy dashboards, and the automation frameworks that keep them honest.
A production-minded API automation testing framework for order and payment workflows. Layered test suites (smoke / functional / contract / resilience / security), data-driven cases from YAML, JSON and Excel, idempotency-aware retry, secret redaction in logs, and architecture decision records documenting the why behind each choice.
Python · pytest · httpx · FastAPI · Docker Compose · GitHub Actions
A fund review and watchlist monitoring workbench. Tracks NAV history, holdings concentration, benchmark comparison and review notes, with per-user data isolation, WebSocket push updates, a caching layer with third-party API fallback, and CSV export.
React · Vite · Tailwind CSS · Zustand · Express · SQLite · JWT
A small REST API for posts and comments, built to be easy to read, run and extend. Ships three interchangeable storage backends (JSON, SQLite, PostgreSQL) behind one interface, JWT admin auth, comment moderation, an OpenAPI document, and a Docker image with a health check.
Node.js · Express · JavaScript (ESM) · JWT · Docker
🖼️ PhotoCullAI
A desktop tool that scans large photo and video libraries and helps you decide what to keep — near-duplicate grouping, quality scoring, face grouping and Live Photo handling, with a report you can export.
Python · PyQt6 · OpenCV · InsightFace
An AI research assistant that chains web search, scraping, data analysis and report generation into a single conversation, with multi-turn memory and result export.
Python · FastAPI · React · TypeScript
A task management app with categories, priorities, due-date tracking, combined filtering, batch operations and an analytics view. Data persists locally, no backend required.
React 18 · TypeScript · Zustand · Tailwind CSS · Chart.js
An interactive visualisation of the Banker's algorithm for deadlock avoidance. The algorithm core is deliberately decoupled from the Swing UI so it can be unit tested headlessly, and it is.
Java 17 · Swing · JUnit 5 · Maven

