Festam
A live map of local festivals: events on a map with a time slider, and your location shared with friends. Councils buy a licence and their local groups manage the events.

- Type
- Web app and B2B SaaS for councils
- Backend
- NestJS on Lambda + HTTP API
- Data
- MongoDB, DynamoDB and S3
- Infrastructure
- AWS CDK
- Languages
- Catalan, Spanish and English
Design decisions
Public reads never touch the database
The API writes a JSON read model to S3, split into 0.5° geographic cells. CloudFront serves it and it is invalidated on every change, so neither Lambda nor MongoDB sees anonymous traffic.
Each kind of data in the right store
MongoDB with 2dsphere indexes for festivals and events; single-table DynamoDB for each user’s data and shared locations, pushed to friends over WebSocket.
Layers enforced by the linter
Controller → Facade → services → repositories, with cross-layer dependencies checked by lint so the architecture doesn’t erode.
AI to import the festival programme
Bedrock turns the programme (PDF or image) into structured events that are reviewed in the dashboard before publishing.
- NestJS
- AWS Lambda
- CDK
- MongoDB
- DynamoDB
- CloudFront
- Bedrock
- Expo
- Astro
Architecture
Go deeper
- Readstore vs synchronous calls between services
When keeping a local copy of another service's data pays off, and what it costs in consistency.
- Anatomy of this site: Astro, S3 and CloudFront for next to nothing
The full diagram of a static site on AWS: what each piece does, what was ruled out and what it costs.
