Skip to content

ops: park relay — every path to a static paused page - #128

Merged
sgharlow merged 2 commits into
masterfrom
ops/park-2026-10-25
Oct 26, 2026
Merged

sgharlow merged 2 commits into
masterfrom
ops/park-2026-10-25

Conversation

@sgharlow

Copy link
Copy Markdown
Owner

Parks relay per Steve's 2026-10-25 portfolio ruling (no arms-length demand signal; heaviest maintenance load in the portfolio).

What merging does: every path on relaystandby.com 307s to a static public/paused.html, so no route handler runs — no DSQL read or write, no OpenAI, no Resend. The hourly /api/cron/heartbeat lands on the paused page.

Users affected: none. users = 2, both Steve's own gmail plus-aliases (read under .env.ro); the one paid subscription is Steve's card test.

Before this merges: on-demand DSQL backup a314dd50-352c-4b56-a987-2af21999a6cf (relay-vault, 2.96 MB, no expiry). The heartbeat schedule and the scheduled monitor workflows are disabled so they do not alarm on the paused site.

Verified locally on a production build (next start, dead credentials): 7 app paths 307 to /paused.html; page, icon and favicon 200; page checked at phone width. test:coverage (TZ=UTC) 4509 pass, lint clean, tsc clean. New lib/ops/parked.test.ts seen red with PARKED = false.

Rollback (< 2 min): promote dpl_A2f6G8YyBWdR3k2tDs8M1E8jx9Jm in Vercel, or set PARKED = false and merge. Full unpark steps: PROJECT.yaml → parked.unpark.

Steve's portfolio ruling: relay is parked. No arms-length demand signal and
the heaviest maintenance load in the portfolio.

- next.config.mjs: PARKED redirect (307) of every path to public/paused.html,
  so no route handler runs (no DSQL, OpenAI or Resend). The page itself,
  /_next/, icon.svg and favicon.ico are excluded so it renders and cannot loop.
- public/paused.html: static, no script, palette from globals.css. The mark is
  inlined because src/app/icon.svg's comment contains "--" (invalid XML), so an
  <img> will not render it.
- lib/ops/parked.test.ts: matches the rule with Next's own path-to-regexp;
  seen red with PARKED = false.
- PROJECT.yaml: lifecycle parked + parked block (0 real users at park, what is
  off, what is kept, pre-park snapshot a314dd50, unpark steps, 12-31 review).
- README: parked banner.

Verified locally on a production build (next start, dead credentials): 7 app
paths 307 to /paused.html, page + icon 200. test:coverage (TZ=UTC) 4509 pass,
lint clean, tsc clean.
@vercel

vercel Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
relay Ready Ready Preview Oct 26, 2026 2:43am UTC

Request Review

The required axe check failed on the park PR with "REACHED 0 OF 18 PAGES":
every page now 307s to /paused.html, and the audit (correctly) refuses to
score a redirect as the page it asked for. It was auditing a site that no
longer exists.

While the park redirect is the first rule in next.config.mjs, the audit now
runs axe on /paused.html at the phone viewport and exits on that result,
before the owner-mode block (owner mode does not exist while parked). It
reads the config, not an env var, so it cannot disagree with what is
deployed, and unparking restores the full run with no edit here.

Seen both ways against a local production build: clean -> exit 0; planted
<html> with no lang -> html-has-lang (serious), exit 1.
@sgharlow
sgharlow merged commit 0a0fe5e into master Oct 26, 2026
4 checks passed

This branch was successfully deployed

1 active deployment
Preview — 37ddcb6f Deployed Oct 26, 2026 by vercel[bot]
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.

1 participant