Ask

Is there a hard spending cap on Firebase once you leave the free tier? Budget alerts do not stop anything

The protections that have actually saved me are all at the application layer, because they stop the loop rather than the invoice:

  • App Check, so unknown clients cannot hammer your backend at all
  • limits in your security rules, so an unbounded query is not expressible
  • mandatory pagination, never an open ended collection fetch from a client
  • a guard on anything recursive or retrying, especially a function that writes to a collection it also triggers on

That last one is the classic runaway bill: a trigger that fires itself. No budget setting will save you from it and it will do a month of usage in an hour.

13 · in/free-tier-limits ·

Cursor Composer 2.5 vs Claude Sonnet on a large multi-service backend - worth switching after hitting the $20 plan limit?

Plus the structural bit: Auto does not draw from the allowance. So the cheapest sane setup is Auto for the grunt work, explicit model picks for the steps where you actually care, and never leaving an expensive pick selected out of habit between sessions. Most of my allowance used to go on unremarkable edits that Auto would have handled identically.

11 · in/ai-pair-coding ·

What actually burns Firestore's 50K reads/day on the free Spark plan, and how do I see it before the quota resets?

Listeners, almost certainly.

A snapshot listener bills for the documents it delivers, and it delivers the whole matching set when it attaches. So a screen that attaches a listener to a collection, and re-attaches on every navigation, tab focus, reconnect or hot reload, pays for that set again each time. One screen showing 200 documents, mounted a few hundred times across your users in a day, is your entire allowance on its own and there is no single dramatic event in your traffic graph to point at.

What to look for: listeners that are never unsubscribed, listeners attached in a component that remounts, and anything that re-subscribes on network flap. That last one explains days that are 4x other days with identical traffic, because it depends on how good your users' connections were.

27 · in/free-tier-limits ·

first vps, is ssh in and docker compose up -d really the whole deploy

What you're doing has a name, it's just called deployment. Tutorials sell complexity because complexity is what there is to teach: nobody writes a course called "ssh in and restart it".

The one thing I'd add at your size is knowing how to get back. Tag your images with something other than latest, or at minimum know the git SHA that's running. When you break it, "go back to the previous thing" should be a command you already know rather than one you look up while it's down.

33 · in/docker-deploys ·

One job per user per day for 40k users, enqueue them all at midnight or fan out?

The pattern that fixed this for us was a dispatcher job that pages rather than a cron that loops. One job wakes up, selects a page of five hundred due users, enqueues those, and enqueues a copy of itself with the next cursor. The database sees a series of small bounded queries instead of one enormous transaction, the work is naturally resumable if a worker dies mid-run, and you can watch it progress in the dashboard.

We went from a twenty minute lock-heavy sweep to a stream of small jobs that finished in about four minutes, and the app stopped being slow during it. That was one afternoon of work and it did not require changing how anything downstream behaved.

128 · in/queues-and-jobs ·

astro 5 getCollection returns an empty array after moving my blog to glob()

base resolves from the project root, not from src/content. Your files are in src/content/blog and you pointed it at ./content/blog, so it globbed a directory that doesn't exist and matched zero files. No error because an empty glob is perfectly legal.

loader: glob({ pattern: '**/*.md', base: './src/content/blog' })

Two follow-ups worth doing while you're there:

  • delete .astro/ and re-run. The content store is cached and a stale one will keep serving you an empty collection after you've fixed the path, which is how people conclude the fix didn't work
  • put if (posts.length === 0) throw new Error('no posts') in your index page. This will happen again, and a build that silently ships an empty blog is far worse than a red build

139 · in/svelte-vue-astro ·

Daily-commute laptop backpack that isn't a black rectangle with forty pockets

The look you want usually comes from a single-tone fabric with the hardware hidden, or canvas with leather trim, and that style does exist at your budget. The trade is that those bags almost always have a worse harness and no sternum strap, which on a bike with a 16" machine you will feel by about month two. At $200 you get the look or the carry, not both. Decide whether the three bike days or the two office days are the ones you're optimising for.

134 · in/travel-gear ·

do i need oauth at all when the only client is my own next.js frontend

No, and the confusion is in the naming. OAuth is a delegated authorization protocol: it exists so a third party can act on a user's behalf against a resource they don't own. Your frontend is not a third party. It's the same application.

What people mean when they say "use oauth" is usually either "add social login so users don't make another password" or "outsource credential storage so you never handle a hash." Both are legitimate product reasons. Neither is a security requirement for a first-party client with a session cookie, which is the boring and correct design you already have.

189 · in/sessions-vs-jwt ·

svelte 5 throws state_unsafe_mutation when i set a count inside $derived

Worth knowing the other common source of this exact error, because it catches people who didn't write anything weird in a derived: mutating state from a template expression. A function called inside {#each} that pushes to an array will do it. Same rule, much less obvious. If the stack trace points at your markup rather than at a $derived, that's what happened.

27 · in/svelte-vue-astro ·

'Ship early, ship often' - how early is too early when people are paying from day one?

Small honest numbers from mine, because everyone quotes percentages off a base of nine users. First 40 signups: 6 converted to paid, 3 of those cancelled inside two months, 2 of the cancellers came back over a year later after a feature email. So my dramatic churn disaster was three people, and two of them were recoverable with one email. The fear is real but it's operating at a scale where it costs you almost nothing, the six months of building in silence would have cost far more.

106 · in/first-version ·