When I started building poketto.me about a year ago, I didn’t know much about my tech stack. I knew I wanted an Angular frontend because it’s flexible and scalable—and I had some prior experience with it. I also knew I wanted to run everything on Google Cloud because of their generous Startup Program and because I was somewhat familiar with the environment from previous jobs. But other than that? I pieced together a stack through trial and error, loosely basing it on the idea that you don’t need to bring out the big guns right away…

Here’s what I started with:

  • CloudSQL as a relational database
  • A Cloud Run service (request-based) for my Python backend which also serves the Angular frontend
  • Angular Material as a component library
  • For the first 100 or so users, I actually sent them a “Welcome to poketto.me!” email manually

What changed over time?

  1. I quickly ditched Cloud SQL for Firebase due to pricing.
  2. I introduced PostHog for product analytics and feature flagging.
  3. I added a separate Cloud Run service with GPUs for the text-to-speech feature.
  4. I added Stripe for payments.
  5. I added and then removed RevenueCat for subscription management, which I am now doing in my own code.
  6. I introduced BigQuery as a second database solely for full-text search.
  7. I added Klayvio for email automation, thus professionalizing the welcome email sequence. Now, new users receive four emails over four days after signing up, which gradually introduce them to more advanced features.

Based on what I learned from these experiences, what would I change? With parlametrics, I had the chance to start fresh. Here’s what I did differently from the outset:

  • Supabase is my database of choice
  • A Cloud Run service likewise serves my python backend, but: The Angular frontend is deployed to its own GCS bucket, not “into” the backend.
  • I’m still using Angular Material, but very lightly. The dropdown/combo boxes, for instance, are the ones from ng-select.
  • For charts and visualizations, I use ngx-charts mostly and d3-js wherever necessary (such as for the chord diagrams)

I consider this year of trial and error to be immensely valuable. Some decisions, such as whether to bundle the compiled frontend with the backend CloudRuns service, were made intentionally. For others, such as the database, I honestly didn’t know any better at the time. In all cases, though, the “slow” approach—trying something out, understanding its pros and cons, deliberating, and then choosing a different path—had an undeniable upside: In all these cases, I learned something valuable.