Since the early days of poketto.me, I’ve been dissatisfied with my persistence architecture. I started with Google Cloud SQL, but I quickly realized that it was too expensive for a small app. I switched to Firebase and had Claude do the replatforming, if you remember. However, when I introduced full-text search, I had to add BigQuery as a second database just for that because Firebase doesn’t have full-text indexing. The point is: It’s a lot of headaches for something that should be easy.
Enter: Supabase.
Supabase is a cloud-hosted Postgres database that comes with full SQL support Additionally, it has a convenient fluent API for Python.
Check it out:
response =
supabase.table("saves")
.select("id, title, saved_at")
.eq("user_id", some_user_id)
.execute()
And full-text indexing is basically built-in:
response =
supabase.table("saves").text_search('fts', search_term, options={
config': 'english',
'type': 'phrase'
})
Additionally, it supports vector embeddings with the pgvector extension. Therefore, if you plan to use your data in an RAG pipeline1, you won’t need a separate vector store database.
It also comes with an intuitive web interface—anyone remember phpMyAdmin?

But the killer feature for me: Their free tier is really generous!
- 50,000 monthly active users
- 5 GB egress
- Runs on a VM with a shared CPU and…
- 8 GB storage2
- 500 MB RAM
Needless to say, if I had known about Supabase from the beginning, I would have built poketto.me with it. However, it’s never too late to migrate!
Something I wouldn’t recommend for most use cases. See here. ↩︎
One thing I couldn’t figure out was whether you can actually use all 8 GB of disk space for the database. The documentation hinted at a “500 MB limit” for the database itself, but: One of my projects runs happily with a 1.17 GB database, so… 🤷 ↩︎