Work
What I built, and what is hard about it.
Each case study states the problem, the design and its trade-offs, and what it still does not handle. The ones with source link to it; the private one says so.
Index
- 01Personal capstone2026
Credit-card onboarding pipeline
A duplicate message here is not wasted work. It is a second hard enquiry on a real person's credit file.
- Java 17
- Spring Boot 3.5
- PostgreSQL 15
- RabbitMQ
- Resilience4j
- Flyway
- 7 ADRs, including the ones that record what is not built yet
- 138 tests; one runs the whole pipeline against real Postgres and RabbitMQ
- 8 Prometheus alert rules, 4 Grafana dashboards
- 02Own open source · MIT2026
splitlint
The broken chunk still joins back into the original string. Nothing throws; retrieval just gets worse for one language.
- Python
- Unicode UAX
- pytest
- GitHub Actions
- 766 of 766 official Unicode grapheme conformance cases pass
- LangChain's RecursiveCharacterTextSplitter fails 10 of its 12 cases
- Grew out of an upstream fix in langchain4j
- 03Open-source contribution2026
AST-RAG: code retrieval for AI agents
Text chunks cannot answer "who calls this?". The graph can, but only if every file is parsed correctly and the parser is safe to share between threads.
- Python
- Tree-sitter
- Neo4j
- Qdrant
- SQLite
- Most of the repository's commit history is mine
- Parse cache: content-addressed, bounded, two backends
- Fixed a data race that corrupted results instead of crashing
- 04Own open source · MIT2026
Plumb
Ask an agent whether the feature works and it will say yes, sincerely, having verified nothing. "Done" was never defined, so the only available answer is a feeling.
- Python 3.10+
- Claude Code hooks & skills
- mypy --strict
- GitHub Actions
- Zero runtime dependencies, no network, no telemetry
- Uninstall removes only files whose hash it recorded
- Never changes the user's permission mode
- 05Professional · a global bank2023–2026
Legacy service modernization
Behaviour had to be provably identical before and after, including the parts nobody had documented, because the thing on the other end of the endpoint is somebody's account.
- Java
- Spring Boot
- PostgreSQL
- REST
- SOAP
- Elasticsearch
- 17+ endpoints migrated, ≈35% of the programme
- Test coverage raised to 80% by writing the test first
- Legacy maintenance overhead down ≈25%