The boring night every stack needs
Some nights you ship a feature. Last night on Binderdex we did the unglamorous version of progress: retire old tools, bump the floor, then put the agent SDK through its biggest jump yet. Here is what changed and what it might save you.
Retire the linter nobody else runs
One cleanup choice stands out for anyone maintaining a solo monorepo: we ran a homegrown unused-code auditor, and it was the only gate of its kind in the repo. knip does the same job (unused files, exports, dependencies) as a maintained standard, so we swapped it in and deleted ours. The tradeoff was real, and it is written down: a public tool fails repo-wide when it breaks, while the homegrown one failed quietly. We picked visible failures.
The 3 a.m. fleet upgrade, as a checklist
Then the toolchain jump: pnpm 11, Node 24, and AI SDK v6 to v7 across a Next.js 16 monorepo. Roughly ten commits, mostly mechanical, and the pattern matters more than the versions. One pnpm-workspace.yaml exclusion list keeps the youngest packages pinned while the repo's own minimum-release-age policy ages them in:
# pnpm-workspace.yaml: let the freshest packages cool down
minimumReleaseAge: 1440 # minutes
exclude:
- ai@7.0.128
- '@ai-sdk/gateway@4.0.104'
- '@ai-sdk/provider-utils@5.0.54'
- '@ai-sdk/provider@4.0.22'
Run the official codemods, bump the OpenRouter provider to the version that speaks v7, and keep production model IDs untouched so the rollout is one variable at a time. If your release policy and your newest dependency ever disagree, this is the escape hatch.
Stop scaring users who already own Pro
The night's user-facing fix came from analytics, and it is a class of bug worth knowing. One Android user hit a "Purchase Failed" alert twice, then made a second account and hit it again. PostHog showed the error code: the store was saying this account already owns Pro. The fix is honest UX in the paywall, driven by a tiny pure function you can unit test:
// what to say when a purchase fails, as data
export function purchaseErrorView(code: string) {
if (code === ALREADY_OWNED) {
return {
title: "You already have Pro",
primary: "Restore purchases",
secondary: "Not now",
};
}
return { title: "Purchase failed" };
}
The user was never broken. The app just failed to translate the store's no-op into a sentence. Half of mobile support is translation like that.