Skip to content

chore(control-plane): bump next back to ^16.2.6 (undo 16.2.5 pin)#1934

Merged
nicoloboschi merged 1 commit into
mainfrom
chore/bump-next-16.2.6
Jun 2, 2026
Merged

chore(control-plane): bump next back to ^16.2.6 (undo 16.2.5 pin)#1934
nicoloboschi merged 1 commit into
mainfrom
chore/bump-next-16.2.6

Conversation

@nicoloboschi
Copy link
Copy Markdown
Collaborator

Summary

Reverts the temporary next pin from #1928 and restores ^16.2.6 (resolves to 16.2.7), bringing back 16.2.6's security fixes (proxy-bypass + SSRF).

Why the pin wasn't needed

Deeper investigation corrected the original diagnosis. The control-plane redirect loop (#1926) is not a 16.2.6 regression — it reproduces identically on 16.2.5 and 16.2.6:

HOSTNAME 16.2.5 16.2.6
127.0.0.1 307 loop 307 loop
0.0.0.0 (prod default) 200 200

The loop is triggered specifically by binding the standalone server to 127.0.0.1: Next normalizes 127.0.0.1localhost in the proxy's request.url but keeps 127.0.0.1 in the router's initUrl, so next-intl's locale rewrite looks cross-origin and leaks as a 307. With 0.0.0.0 both sides agree → 200.

The production launchers (docker/standalone/start-all.sh, bin/cli.js) bind HOSTNAME=0.0.0.0, which serves 200 on every version. So the pin neither fixed #1926's repro (which uses 127.0.0.1) nor was needed for production.

Change

  • hindsight-control-plane: next 16.2.5^16.2.6
  • root package.json: drop the now-unneeded overrides.next (^16.2.6 dedupes next-intl's peer to a single version on its own)
  • lockfile: next-family 16.2.516.2.7, single hoisted, all platform binaries preserved (minimal 40/40 diff)

Verification

  • npm ci → single deduped next@16.2.7
  • npm run build --workspace=hindsight-control-plane → compiles + typechecks
  • standalone on HOSTNAME=0.0.0.0: /login, /banks/abc, /es/login → 200

Note on #1926

The 127.0.0.1-binding loop is a Next standalone quirk (asymmetric hostname normalization), unrelated to the Next version. Production is unaffected. If we want to support loopback binding, a small follow-up can normalize a 127.0.0.1 bind to localhost; otherwise the guidance is to bind 0.0.0.0 (the default).

Reverts the temporary `next` pin from #1928. Deeper investigation showed the
control-plane redirect loop (#1926) is NOT a 16.2.6 regression: it reproduces
identically on 16.2.5 and 16.2.6, and is triggered specifically by binding the
standalone server to HOSTNAME=127.0.0.1 (Next normalizes 127.0.0.1 -> localhost
in the proxy request URL but keeps 127.0.0.1 in the router's initUrl, so the
next-intl locale rewrite looks cross-origin and leaks as a 307 loop).

The production launchers (docker start-all.sh, bin/cli.js) bind HOSTNAME=0.0.0.0,
which serves 200 on every version, so the pin neither fixed #1926's repro nor was
needed for production. Restoring ^16.2.6 brings back the 16.2.6 security fixes
(proxy-bypass + SSRF). The 127.0.0.1-binding quirk is unrelated to the version.

Verified: npm ci -> single next@16.2.7; control-plane build typechecks; standalone
on HOSTNAME=0.0.0.0 serves /login, /banks/*, /es/login as 200.
@nicoloboschi nicoloboschi merged commit dd75f0d into main Jun 2, 2026
69 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Control plane: every page route 307-redirect-loops under Next 16 (next-intl rewrite leaked as redirect)

1 participant