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!


  1. Something I wouldn’t recommend for most use cases. See here↩︎

  2. 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… 🤷 ↩︎