This started as a fully serverless backend to enable fast iteration.
That worked well initially, but as the system evolved, the limitations became more apparent:
- No persistent WebSocket connections
- Limited options for background jobs and queues
- Reliance on vendor-specific alternatives
- Less control over execution, memory, and long-running work
At that point, serverless stopped being an advantage and started being a constraint.
The Split
I split the app into:
- A fully static SvelteKit frontend
- A standalone Go backend built for concurrency and real-time communication
Why It Was Worth It
The result wasn’t about performance benchmarks or technology preferences—it was about removing friction and making the system easier to build upon as it grows.