Technology stack
What we build on, and the rule for choosing it
A stack is a maintenance commitment, not a preference. These are the technologies we run in production for clients today.
Front end
frontendTyped, accessible interfaces that render fast on mid-range hardware.
- React 18
- Component architecture, hooks, SSR / prerender
- TypeScript
- Type safety across the client boundary
- Vite
- Build tooling and dev server
- Next.js
- When SSR or ISR is a requirement
- Tailwind CSS
- Design-token driven styling
- React Native
- Shared-logic mobile clients
Back end
backendServices with explicit contracts, prepared statements and audit trails.
- PHP 8.3
- Laravel and clean-architecture modular APIs
- Node.js
- Event-driven services and tooling
- Python
- Data pipelines, automation, FastAPI
- Go
- High-throughput services and CLIs
- REST / OpenAPI 3
- Versioned, documented contracts
- GraphQL
- Aggregation over multiple back ends
Cloud & DevOps
cloudEnvironments defined as code, so a rebuild is a pipeline run.
- Amazon Web Services
- EC2, ECS, RDS, S3, CloudFront, Lambda
- Microsoft Azure
- App Service, AKS, Azure SQL, Entra ID
- Docker
- Reproducible build and runtime images
- Kubernetes
- Orchestration where the load justifies it
- Terraform & Ansible
- Infrastructure and configuration as code
- GitHub Actions
- CI/CD with tested rollback
Data
databaseSchemas designed for the queries the business actually runs.
- MySQL 8
- Transactional workloads, InnoDB tuning
- PostgreSQL
- Complex queries, JSONB, partitioning
- Redis
- Caching, queues, rate limiting
- Elasticsearch
- Search and log aggregation
- ClickHouse
- Analytical workloads at volume
Selection policy
How a technology gets onto that list
Boring by default
A technology has to earn its place against the well-supported option. If we cannot name three reasons in writing to deviate, we do not deviate.
Hireable after handover
You have to be able to recruit for the stack once we are gone. That rules out niche frameworks with one maintainer, however elegant they are.
Supported for the contract term
We do not start a project on a runtime whose security support ends inside the expected life of the system.
Exit path documented
For every managed service we introduce we write down what replacing it would take. A dependency you cannot leave is a dependency you did not choose.