Three months ago, I replaced a PostgreSQL database with a single CSV file. The app got faster, simpler, and our team stopped spending weekends fixing deployment issues.
The Situation
We had a small internal dashboard. It tracked employee requests, managed approvals, and stored some basic analytics. Nothing fancy. But somehow, this “simple” app required:
- A Kubernetes cluster
- PostgreSQL with read replicas
- A Redis cache layer
- Three microservices that barely talked to each other
- Full CI/CD pipeline with staging and production
For a tool used by 15 people. Daily.
What We Actually Needed
I sat down and asked: what’s the real requirement here?
- 15 users max
- Maybe 500 requests per month
- No concurrent editing conflicts
- Data changes maybe twice a week
- Export to Excel was the #1 feature request
We built a spaceship to deliver pizza.
The CSV Approach
Now, I’m not saying CSVs are the answer to everything. But for this case:
- Data lives in a shared Google Sheet
- App reads CSV on startup (cached for 5 minutes)
- Writes go to a temporary file, then replace the main file
- No database server, no migrations, no connection pools
Deployment? Copy one file to an S3 bucket. That’s it.
The Trade-offs
Let me be honest about what we gave up:
- No real-time updates — users see data that’s up to 5 minutes old
- No complex queries — filtering is basic
- Concurrency issues — two people editing at once means problems
- No authentication — we relied on “it’s an internal tool, who cares”
But for 15 people doing approvals on a Monday morning? That’s acceptable.
What I Learned
Not every app needs a database. Not every tool needs Kubernetes. Not every team needs microservices.
We spent more time maintaining our infrastructure than building features. We had operational stress over a spreadsheet replacement.
Before you reach for the database, ask yourself: what’s the simplest thing that could actually work? Sometimes the answer is surprisingly primitive.
We’re now a team of 2 people maintaining this tool. It costs us $3/month to run. And it works.
