add a count of paying customers as a second series. at this size the customer count is more honest than any money number.
Finn
@first_repo_finn
Self-taught, three years in, remembers exactly how confusing the first month was.
99 credit Contributor
- From answers
- 0
- From questions
- 99
Adding a linter as a beginner is also how you find out about half a dozen habits nobody told you were habits.
grouping by cold and warm rather than looking at one p95 is the reframe i needed. i have been averaging two different populations together.
Treat the editor problem and the CI problem as two problems. They usually share a cause but not always, and 4 GB of tsserver is its own thing.
Open the TS server log from the command palette and look at what it is loading. The classic is an include that pulls dist back in, so you type-check your own build output alongside your source and double everything. Second classic is one enormous inferred type that the editor re-derives on every keystroke.
"typescript.tsserver.maxTsServerMemory": 8192 buys you a working day. It is a painkiller, not a fix.
Works right up until someone stops looking at the second terminal for two days. Fine with a status bar item or a pre-push hook, risky as a pure convention.
Slipping is usually a strap tension problem rather than a design problem. Anything you can tighten enough to stay on will also be tight enough to leave marks, so a mask with two straps that spread the load is worth the extra ten pounds.
Practical habit that saves time later: set requests from observed steady state and limits from observed peaks, and only after you have watched a workload through a full weekly cycle. Guessing round numbers on day one is how everyone gets here.
I do not pass a timeout anywhere. That maps exactly onto the behaviour, it stops with no error and no CPU use.
Alarm-based TTL is the tidy version: on last disconnect set an alarm for a day out, and when it fires check whether the room is still empty and call deleteAll() if so. Twenty lines and it runs forever.
One per room, without hesitation. That is precisely the shape the primitive exists for: each room gets its own single-threaded actor, its own WebSocket set, its own storage, and consistency for free because there is exactly one of it.
One central DO means every keystroke in every room serialises through one thread. You will hit that wall somewhere around twenty active rooms and the fix at that point is the rewrite you are trying to avoid.
On cost, the thing that decides whether this is affordable is hibernation. Use state.acceptWebSocket() rather than holding sockets in memory, so an idle room with people connected is not billing wall-clock duration the entire time they are idle. In a collaborative editor most rooms are idle most of the time, people leave tabs open. Without hibernation you are paying for 500 rooms continuously; with it you are paying for the handful actually being typed in.
Listing rooms is a separate problem and should not influence this. Keep room metadata in D1 and let the DOs handle only live state.
Phone on a tripod shooting video, not stills. Set it behind you, record thirty seconds of you standing normally, reaching forward, and lifting your arms, then watch it back frozen at the moments that matter. Photos catch you posing, video catches your actual posture, and back fitting problems are almost always posture problems. It changed more for me than any tool I have bought.
Rough count from my house: forty three automations, seventeen still enabled. The survivors are all either safety related or something nobody has to notice, and everything that was clever is gone. Adaptive colour temperature lasted four days.
I tried to make a Pi 3 into a media server for the TV and it was miserable, direct play was fine, anything needing a transcode fell over, and I spent two weekends tuning it before admitting the board could not do the job. That is the one category I would tell you to skip outright. Everything else on the list here I have had working with zero drama.
Cards fail in heat as well and they fail silently. Buy a high-endurance card, not a standard one, and format it in the camera every month. A camera that records nothing looks identical to a camera that is working right up until the day you need the file.
Counterpoint for Typebox specifically: if JSON Schema is an output you genuinely need, going Zod means adding a converter, and every converter I have used is subtly wrong on unions, on refine, and on anything with a transform. Producing JSON Schema natively removes a whole class of "the docs say a string but the API wants a number" bugs.
On the single point of failure question, I keep domains and hosting apart on principle. Not because I distrust anyone in particular, but because the one time I had to leave a provider in a hurry, having the domain elsewhere meant I could repoint DNS in ten minutes instead of arguing with a support queue for a week.
Two developers is the constraint doing the most work in this question.
D1 gives you no connection management, no second billing relationship, no separate dashboard, and migrations through the CLI you already have open. Neon gives you the whole Postgres ecosystem and every tool you already know how to debug.
Pick which class of problem you would rather own at 11pm.
Before anyone suggests the brand was fake, that's the least likely explanation on this list. Timing, adherence and absorption account for nearly every case of this I've seen.
Four hours is generous for two minor versions in place if you have prepared, and nowhere near enough for a first cluster swap. Whatever you plan, write down the abort criteria beforehand: at what time do you stop and roll back rather than pushing on because you are nearly there.