Numbers from my own use, since nobody ever posts them: bought at $595 on sale, sold at four years for roughly 40% of that on a resale site. Real cost about $85 a year. My previous $120 bag lasted three years and resold for nothing, so about $40 a year. Closer than I expected, and the premium bag was nicer for all four of those years. The risk you're taking is that the resale market stays where it is.
Bo Halvorsen
@edge_runtime_bo
Performance-obsessed developer at a small booking startup. I chase p95 latency for a living and I keep a spreadsheet of cold start times across every runtime we have tried.
60 credit Contributor
- From answers
- 0
- From questions
- 60
Whichever you choose, make the send idempotent before you make it durable. Both approaches will eventually run a job twice, because at-least-once is what you get from anything that retries, and a duplicate email is worse than a slightly delayed one. Store a key on the row for what the message is about, check it before sending, and record the send in the same transaction that marks the job done. That single decision has saved me far more embarrassment than any queue choice.
Go, on the deadline alone. A competent Python developer is writing useful Go within a couple of days and reviewing it usefully within two weeks. Rust is a genuinely better language for several things you might care about later, and it is also a month of your six being spent learning when to clone and which async runtime you are in. Six weeks with a hard external date is not the project you learn a hard language on.
Strong agree on capping concurrency. The most common Go performance incident I have seen is not slow code, it is a goroutine per item hammering a connection pool sized for twenty.
Same setup here. The one refinement worth adding is a dated filename on the phone copy so you can tell at a glance how stale it is.
The middle option nobody mentions is paying someone. Four times a year, six knives, dropped off at a shop or a market stall that does it properly. If you genuinely do not want the hobby, that is a defensible answer, and it is what I did for three years before I got curious. Just ask what they sharpen on, because some places use a belt grinder that gets hot and some use water cooled wheels, and it is worth knowing which.
The npm-as-PID-1 thing is everywhere. It also makes every docker compose down take exactly ten seconds, which people accept as normal for years.
start with real-time listeners, because that's where nearly all of these come from. a listener attached inside a component that remounts will re-subscribe every time, and each new subscription pulls the initial snapshot again, so a list of 200 documents on a screen that remounts on every keystroke turns into an astonishing number very quickly. grep for every onSnapshot in the diff, check each one has an unsubscribe that actually runs on unmount, and check none of them are created inside a render path. mine was a listener in a component that remounted whenever a parent's state changed, which was constantly.
Politely disagreeing with the framing. You asked what fifty candles cost, but the real question is what fifty sellable candles cost, and the answer includes about four weeks of testing before you pour any of them. Eight weeks is genuinely tight if you have never poured. I would buy materials for twenty test candles now, in one fragrance, and only order jars in bulk once you know your wick size. Ordering fifty jars before you have a working recipe is how people end up with fifty jars of something they cannot sell.
Counter-consideration while everyone piles on Astro: if these docs are internal, behind auth and never seen by a crawler, half the argument evaporates. A Vite SPA is one build, one mental model, one router, and your team already knows it. Prerendering 150 pages of HTML for an audience of 60 employees optimises for something you don't have.
Still probably Astro for the authoring experience, but "it's internal" genuinely moves the weights.
The date isn't your problem, the scope is, and dates slip because scope is allowed to be vague. Try this instead: write the release notes for version one first, in past tense, on a single screen with nothing scrolling off the bottom. Then delete lines until you'd be comfortable showing it to someone whose opinion you fear slightly. The earliest possible date is the day you're actually willing to delete things, and it's usually much sooner than the date you keep picking.
Just make sure "later" has a ticket with a date on it. Every team I know that said this shipped the three and then discovered two years later that the reporting service was reading a table nobody had gotten around to.
If your framework has an after-commit hook, use it, and understand what it does and does not promise. It removes the rollback problem completely, which is the failure that produces user visible nonsense like an email about a cancelled order. It does not remove the crash-in-the-gap problem, because nothing running in your process can. For a lot of applications that is an acceptable trade, and it is one line of code rather than a new component. Just be honest that you have chosen the silent-loss failure over the phantom-job failure rather than solved anything.
For the dashboard section, don't island it. Authenticated app pages with lots of interconnected state are exactly the case where you make the whole route one island, or just a client-rendered subtree: and stop fighting the model. Astro is quite happy to be a static marketing site and an app shell in the same project.
Worth checking your actual cache TTL while you're in here. "rendered 2 hours ago" means something is serving HTML at least an hour stale, which may or may not be what you intended for that route.