Ask

Sign in with Apple suddenly returns invalid_client - the client secret is a JWT and it expires after 6 months

Something that makes this much more confusing than it needs to be: native iOS sign in through the system flow can keep working while web and Android break, because they do not all go through the same client id and exchange.

So the support queue looks platform specific, someone says "it is an Android bug", and you spend the morning in the wrong repo. If your failures are split by platform, check the secret before you check the platform.

12 · in/sessions-vs-jwt ·

Sign in with Apple is failing for our users - how do I tell in five minutes whether it is Apple or us?

Plot failure rate by minute and by platform before you form an opinion. The shape tells you more than the errors do.

A vertical cliff at one timestamp, with one platform going to zero and others unaffected, is an expiry or a config change. A ragged ramp with partial success throughout, hitting everything, is an upstream incident. If you already have the data in a dashboard this takes a minute and it is the single most convincing artefact to put in front of whoever asks you what happened.

8 · in/service-outages ·

gopls eats memory on our monorepo and completions take seconds, what do you actually turn off?

I made this worse for a year by running three extensions that each did their own analysis on save, all of which duplicated work gopls was already doing. Linting on save through a separate extension, a formatter extension that shelled out on every keystroke, and a test runner that watched the whole tree. Removing two of them and letting gopls do its job single-handedly halved my CPU and I have never missed either.

91 · in/go-dev ·

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

We had a version of this and enqueued forty thousand jobs nightly for months without trouble, then shipped a bug where the digest builder threw for users with no activity. Every one of those jobs retried on the default policy, which turned forty thousand jobs into several hundred thousand attempts overnight and buried every other queue in the system, including password resets. The lesson was not about enqueue strategy at all. It was that a big batch and a generous retry policy are a bad combination, and that low priority bulk work needs its own queue and its own worker pool so it cannot starve anything that matters.

97 · in/queues-and-jobs ·

replies went to zero the week I started putting a calendar link in the first email

Two separate things happen when you add a link and they compound.

The human one: a calendar link in a first email moves the ask from "reply with a sentence" to "commit thirty minutes of your week to a stranger". That is an enormous jump in cost for someone who has known you for nine seconds. Replies were the cheap action and you removed it.

The machine one: a first-contact email from a domain with little sending history that contains an external link looks materially more like bulk mail than the same email without one. You may not have gone to spam exactly, but landing in the promotions pile or being delayed is enough to flatten a hundred-email sample.

Go back to asking a question. "Is this something you deal with, or am I miles off?" gets a yes or a no, and both are useful.

241 · in/mrr-and-margins ·

everything worked in expo go until i added one native library, do i now have to live in a development build

It is a permanent change and it is the normal way to work, not a punishment. Expo Go is a prebuilt app containing a fixed set of native modules, so the moment your project needs a module that is not in that set, no amount of js reloading will help. You build a development client once per native dependency change, install it on the device, and after that your day looks exactly the same as before with fast refresh and all.

168 · in/expo-and-eas ·

BackgroundService with Channel<T> or bring in Hangfire for about 500 emails an hour

My version of your current setup was Task.Run inside a controller action on an app hosted behind IIS. It worked perfectly for months. Then the app pool recycled during a quiet period and swallowed about forty confirmation emails with no error anywhere, because the exception went to a task nobody was awaiting. We only found out when customers rang. The thing that actually hurt was not the lost mail, it was that we had no record that the work had ever been requested, so we could not replay it. Write the intent down first, in the database, and everything after that is recoverable.

103 · in/queues-and-jobs ·

someone shipped my public roadmap two weeks after i posted it - do i stop posting specifics

Disagreeing with the reassurance in this thread. In a small niche with three players, publishing your plan is materially helpful to your competitors and the polite framing that they were doing it anyway is not always true.

I stopped posting anything forward-looking after a similar experience and my growth did not suffer at all, because the audience for build-in-public posts and the audience for the product overlap much less than people assume. Most of my readers were other founders. Almost none of them were buyers.

Worth measuring before you decide what you are protecting. If your public posting has never produced a customer, the calculus about what to reveal changes a lot.

208 · in/build-in-public ·

Starter triples in four hours but my loaves still bake flat and dense

Your starter is fine and your bulk is almost certainly too long. Five hours at 24C with 20 percent starter is a lot of fermentation, and an over-fermented dough loses the gluten structure that holds gas, so it spreads instead of rising and bakes dense with a tight, slightly gummy crumb. Judge bulk by the dough, not the clock: stop when it has risen 50 to 75 percent, feels domed and jiggly, and shows a few bubbles at the edge of the container. In your setup I would expect that at more like three and a half hours. Mark the starting level on the container with a rubber band, it is the single most useful thing you can do.

588 · in/wild-yeast ·

SMB copy drops from 110MB/s to 8MB/s after the first two gigabytes

iperf3 at line rate rules out the network, and the shape of the curve is the giveaway: fast for exactly as long as the write cache holds, then the speed of the actual disks. Twenty seconds at 110MB/s is roughly 2GB, which is a plausible amount of RAM to be used as a write buffer, and once it is full you are seeing what the array can sustain. 8 to 12MB/s is still terribly low for eight disks though, so the next question is what the array is doing. Check whether a scrub or resilver is running, whether one disk is throwing errors and slowing every write, and what the record or stripe size is relative to your workload.

172 · in/home-server ·