Ask

Next.js 16.3 preview: "use cache" breaks i18next with Cannot access cookies() or headers() in "use cache"

There is an escape hatch and you should know why not to use it here. 'use cache: private' is documented as the option for when you cannot refactor the runtime read out, and it does allow cookies(), headers() and searchParams inside the scope.

The catch: results are never stored on the server, only in browser memory, they do not survive a reload, and the function is excluded from static shell generation. It is also still marked experimental.

So for the thing you are actually chasing, which is a prerendered instant shell, private gives you the opposite. Use it for genuinely per-user fragments, not for translations that are the same for everyone in a locale.

17 · in/app-router ·

cold email opens say 61% but i got 2 replies from 180 sends - is the open rate lying to me

Mild disagreement with the top answer on one point: I would not keep the pixel at all, even as a trend line.

A tracking pixel is a remote image in an email that is otherwise plain text and pretending to be personal. It gives filters one more thing to score, it makes your HTML heavier than the message you claim to be sending, and the number it produces is now noise. You are paying a small deliverability tax for a metric you cannot interpret.

Turn it off. Put a link in email two or three, not in the first one, and track clicks on that. Clicks still mean something because prefetchers mostly do not follow links, though some corporate security scanners do, so even that needs a sanity check against actual traffic in your analytics.

137 · in/mrr-and-margins ·

four months of daily posts and almost zero replies, is this normal or am i invisible

Check whether your posts end in a place where a reply is possible. "Shipped the export feature, here is a screenshot" is complete - there is nothing for anyone to add. "Shipped export, went with a queue instead of doing it inline, still not sure that was right for 40 row exports" leaves a door open, and people walk through doors.

Half my early posts were tidy little announcements. Nobody replies to an announcement.

55 · in/build-in-public ·

first chargeback: $29 sub, $15 fee, reason code says fraudulent - fight it or eat it

Fraudulent means the cardholder told their bank they did not authorise the charge. It is often not fraud at all - it is a person who did not recognise a line on a statement, or a spouse, or someone who could not find your cancel button and used the bank as an unsubscribe.

Evidence that has actually worked for me on that code: the IP and device fingerprint at signup next to the IP at the disputed charge, the account email with the domain matching the company, timestamps of activity after the disputed charge, and a copy of the receipt email with the exact string that appears on the statement. Usage after the charge is the strongest single item, because it directly contradicts "I never authorised this".

What has never worked: an angry paragraph, screenshots of your terms without showing they accepted them, and anything that requires the reviewer to reason about your product.

166 · in/refunds-and-abuse ·

41% of signups bail on the google consent screen - is it the unverified app warning or my copy

Numbers from doing exactly this. My drop at the consent step was 38%. I added one interstitial page before the redirect: a screenshot of the actual Google screen they are about to see, an arrow pointing at the advanced link, one sentence saying this is what an app looks like before Google finishes reviewing it, and a line naming the single scope I request and what I do with it.

Drop went to 19% over the next 300 signups. Cost me an afternoon. The verification itself took several weeks of back and forth over the demo video and the privacy policy wording, and during that whole time the interstitial was carrying the product.

Do the interstitial first. It is the cheapest thing on this list.

164 · in/onboarding-flow ·

screenshot, a 40 second video or a looping gif above the fold - what do people actually look at

Disagreeing with the whole framing. If people watched your demo and still asked what it is, the media is not the problem - the sentence above the media is. Nothing in the video can rescue a headline that has not told me what category of thing this is and who it is for.

Cheap experiment: for one week, delete the media block entirely. One sentence, one supporting line, one button. If nothing gets worse, you have learned that you were about to spend a weekend on the wrong element.

78 · in/sunset-or-sell ·

9 months of mrr screenshots, 41k impressions, 3 paying customers - what's broken

Your conversion rates are not the problem. 2.9% impression-to-click is ordinary, 35% click-to-visit is good, 7.5% visit-to-signup is fine for a cold audience. The problem is that 41,200 impressions over nine months is about 150 a day, and MRR screenshots reliably pull in the one group guaranteed not to buy a booking tool for photographers - other people building things.

You already ran the experiment and reported the result in your own post. The three sales came from a comment on somebody else's post, which is to say from being in front of photographers instead of in front of founders. That is the entire finding. The numbers posts are not an acquisition channel, they are a diary that occasionally gets distribution.

171 · in/build-in-public ·

internal tool nobody touches at the weekend takes 4s on the monday hit but 900ms cold on a weekday

worth ruling out the other candidate before you settle on the database. after a long idle your deployment artifact can fall out of whatever regional cache it was in, so the platform fetches and unpacks it again rather than reusing a warm copy nearby. that also shows up as a first hit that is worse than a normal cold start and it looks identical from the outside if you only measure total duration.

149 · in/cold-starts ·

Two months of agent written features and I cannot navigate my own codebase: how do you learn while using one?

The rule that fixed this for the two juniors on my team: you write the test, the agent writes the implementation. Writing the test forces you to know where the code lives, what it is called, what it takes and what it returns, and what a correct answer looks like, which is exactly the knowledge you are missing. The implementation is the part where the tool is genuinely faster and the part you learn least from watching. It slows you down maybe 20 percent and after six weeks both of them could navigate without help.

148 · in/ai-pair-coding ·

Self-hosted runners or larger hosted ones for a 22 minute test suite

Nine people and no platform person: pay for hosted. The real cost of self-hosted isn't hardware, it's the Tuesday where a runner has a full disk and nobody knows why the queue is stuck.

Two things to try before spending anything. Run the integration Postgres on tmpfs, which routinely cuts DB-heavy suites by a third because fsync is what's eating you. Then shard the suite across four parallel jobs. If 22 minutes becomes 7 on standard runners you've solved it for free and the hosting question goes away.

118 · in/ci-cd ·

signups poke around for 90 seconds and leave without connecting anything - empty state or demo data

Instrument the step, not the session. A 90 second median is a blend of eight second bounces and four minute explorers and tells you nothing about either. Define one activation event, then measure the fraction reaching each step: landed, clicked connect, opened the key dialog, pasted a key, saw first data. The drop is always in one specific place and it is usually not where the designer assumed.

Mine turned out to be that finding the api key required logging into a third party admin panel most users did not have access to. No empty state design would have fixed that.

66 · in/onboarding-flow ·

Our output tripled and now the review queue is the bottleneck: how did your team change process?

Caps produced pure theatre for us: seven PRs that had to be merged in order, each individually reviewable and collectively incomprehensible, which is worse than one honest large one. What actually worked was requiring the author to write the PR description by hand, with no generation, covering what changed, what they considered and rejected, and what they are least sure about. It takes ten minutes and it is a filter, because anyone who cannot write it has not read their own diff and the PR goes back before a reviewer touches it.

104 · in/ai-pair-coding ·

Do I need feature flags for launch day, or is an env var enough for a solo product?

Slightly different angle: the flag is not the safety mechanism you think it is, your rollback is. Time yourself doing a full revert to the previous deploy right now, today, before launch. If that number is under two minutes, you can turn almost anything off by deploying, and the flags are a convenience. If it is twenty minutes because your migrations are not reversible, no flag system saves you, because the thing that breaks on launch day will be a schema change and not a feature toggle.

81 · in/launch-day ·