A side-by-side translation guide for Node folks crossing the aisle. The next few sections walk through what changed, why, and the patterns I'm keeping for the next project.
01Setup
I started with a small scope — one feature, one stakeholder, one deploy target. The temptation to over-architect was strong, but the cost of being wrong was low, and that combination is rarer than it sounds.
The constraints I gave myself: no new dependencies for the first week, no premature abstractions, and any decision I couldn't justify in one sentence got rolled back. By day three I had a working slice. By day seven I had a sense of which parts were going to keep biting me.
02The shift
The change wasn't a single moment. It was a slow accumulation of small wins, followed by one decision I couldn't have made on day one. You can read about the research that nudged me, but the practical version is shorter.
The minimum that worked
Most of the value came from three patterns. None were novel. All were boring. Boring is the highest compliment I give to infrastructure now.
The best architecture choices are the ones you can undo in an afternoon.
03What stuck
A handful of patterns survived the first quarter in production:
- One source of truth per concept, even when it felt redundant.
- Server-side data shaping so the client never had to translate between two models.
- Explicit error states — every loading spinner had a sibling for failure.
The code that backed them was unremarkable, which is the point. Here's the shape of the route loader I kept reaching for:
export async function load({ params }) {
const data = await db.query('select * from posts where slug = $1', [params.slug]);
if (!data) throw notFound();
// shape once, on the server, never on the client
return { post: shape(data) };
} If your loader has more than one network call, it's probably doing two different jobs. Split before you optimize.
04Closing
The longer I do this, the less I trust frameworks to make decisions for me — and the more I trust small, observable systems I can hold in my head. There's no grand thesis here. Just a quieter way of working.
If you've made it this far — thanks. The version of me that was stuck on this six months ago would have appreciated reading this. Hopefully it lands somewhere useful for you too.