Uses
The tools,
and why.
A working list rather than a wish list. Everything here is something I have shipped with in the last two years, across regulated enterprise systems and two SaaS products I run alone.
Backend
Where most of the risk lives, so the choices are deliberately conservative.
- Java 21
- Virtual threads, records, pattern matching. LTS matters when the deploy target is a bank.
- Spring Boot 3.5
- Boring in the best sense. The ecosystem is the product.
- Spring Batch
- Still the right answer when the work is bounded and restartable.
- Spring Data JPA / Hibernate
- With keyset pagination once a table gets large.
- Python + FastAPI
- For anything sitting next to a model.
- Flyway
- Migrations in version control or they do not exist.
Data and messaging
The seams where most production problems actually live.
- PostgreSQL
- JSONB, WAL, replication slots. The last two matter more than people expect.
- Apache Kafka
- Plus Kafka Connect where the producer is something I do not own.
- Debezium
- Change data capture, with a heartbeat so the replication slot keeps moving.
- Avro + Confluent Schema Registry
- FULL_TRANSITIVE across team boundaries.
- Redis
- Real-time state and anything priced badly in a document database.
- Elasticsearch
- When the query is a search rather than a lookup.
Frontend
Server-first, with client code where a browser API genuinely requires it.
- React 19
- With the compiler on, so memoization stops being hand-written.
- Next.js
- App Router. This site is one.
- TypeScript
- Strict. Widening to any is a decision, not a shortcut.
- Module Federation
- Micro-frontends into a host portal, when the org chart demands it.
- RTK Query / TanStack Query
- Server state is not client state.
- Tailwind CSS
- v4, tokens in the theme block, no config file to migrate.
Platform
Delivery is part of the design, not something that happens afterwards.
- Kubernetes + Helm
- AKS in the day job, managed platforms for my own products.
- Terraform
- Including the Kafka topics and roles, not just the compute.
- Docker
- Multi-stage, non-root, minimal base.
- Azure DevOps / GitHub Actions
- Whichever the organization already runs.
- SonarQube + Trivy
- A quality gate and an SBOM, in the pipeline rather than in a report.
- Datadog
- APM, because the interesting failures are distributed.
Testing
The bugs worth catching live between components, so the tests do too.
- Testcontainers
- A real database. Mocked repositories hide transaction bugs.
- JUnit + Mockito
- Unit tests where the logic is genuinely isolated.
- Vitest + React Testing Library
- Behaviour, not implementation details.
- Husky
- Hooks that regenerate the type-safe API client from OpenAPI.
AI in the loop
Used daily and openly. The review standard does not change because a model wrote the first draft.
- Claude Code
- Most of the multi-file work.
- Cursor
- For edits that want an editor rather than a terminal.
- GitHub Copilot
- Inline completion.
- OpenAI and Anthropic APIs
- Parallelized calls where latency is the constraint.
Most of these show up in the field notes with the parts that went wrong attached — the Debezium replication slot being the clearest example.