Move to escapement.warehack.ing; fix GFM tables in MDX

The landing page's headline results table was rendering as a paragraph of raw
pipe characters. Astro applies remark-gfm to .md but it wasn't reaching the MDX
pipeline, so every .md page rendered tables fine and only index.mdx was broken —
which is exactly why it went unnoticed. mdx({remarkPlugins:[remarkGfm]}) fixes it.

cuckoo.warehack.ing stays as a permanent redirect; it was live briefly.
This commit is contained in:
Ryan Malloy 2026-07-14 10:51:35 -06:00
parent 3b505644b2
commit 674ad25662
9 changed files with 29 additions and 16 deletions

View File

@ -2,7 +2,7 @@
**What the Raspberry Pi time-server guides get wrong, and the numbers to prove it.**
Docs: **[cuckoo.warehack.ing](https://cuckoo.warehack.ing)**
Docs: **[escapement.warehack.ing](https://escapement.warehack.ing)**
We built a GPS-disciplined Stratum 1 NTP server on a Raspberry Pi 4, followed the
published advice, and measured everything. Most of that advice is wrong on this

View File

@ -174,7 +174,7 @@
<!-- Anyone reading "PPS locked · ±219 ns" and wondering what that means,
or why this box is a Pi and not an appliance, deserves one click to
the write-up rather than a search. -->
<a class="foot-docs" href="https://cuckoo.warehack.ing" rel="noopener">
<a class="foot-docs" href="https://escapement.warehack.ing" rel="noopener">
How this clock works
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M4 8h7M8 5l3 3-3 3"/></svg>
</a>

View File

@ -225,7 +225,7 @@ main { max-width: 1180px; margin: 0 auto; padding: 20px; display: grid; gap: 18p
* Clockmakers signed the backplate the brass face only a repairer sees once
* the case is open. This footer is that plate: a double hairline for the plate
* edge, engraved small-caps for the name, and nothing that moves. A signature
* should be quiet. Same markup as the docs site at cuckoo.warehack.ing,
* should be quiet. Same markup as the docs site at escapement.warehack.ing,
* recolored from brass to this dashboard's cyan.
*/
.ss-plate__link {

View File

@ -4,6 +4,6 @@
COMPOSE_PROJECT_NAME=cuckoo-escapement-docs
# Production: cuckoo.warehack.ing
# Local dev: cuckoo.l.warehack.ing (internal only — never reference publicly)
DOMAIN=cuckoo.warehack.ing
# Production: escapement.warehack.ing
# Local dev: escapement.l.warehack.ing (internal only — never reference publicly)
DOMAIN=escapement.warehack.ing

View File

@ -56,4 +56,4 @@ deploy: ## Pull main + rebuild the docs container on the prod host
@echo "==> deploying $(DEPLOY_HOST):$(DEPLOY_PATH)"
ssh -A $(DEPLOY_HOST) "cd $(DEPLOY_PATH) && git fetch origin main && git reset --hard origin/main && cd docs-site && make prod"
@echo "==> sanity check"
@curl -s -o /dev/null -w " HTTP %{http_code} %{url_effective}\n" "https://cuckoo.warehack.ing/explanation/preempt-rt-made-it-worse/"
@curl -s -o /dev/null -w " HTTP %{http_code} %{url_effective}\n" "https://escapement.warehack.ing/explanation/preempt-rt-made-it-worse/"

View File

@ -10,16 +10,17 @@
// when the dev server runs behind Caddy (TLS-terminating proxy) — without an
// explicit host/protocol/clientPort, Vite's WebSocket drops every ~10s.
//
// Site URL comes from DOMAIN so one image serves both cuckoo.warehack.ing (prod)
// and cuckoo.l.warehack.ing (local dev).
// Site URL comes from DOMAIN so one image serves both escapement.warehack.ing (prod)
// and escapement.l.warehack.ing (local dev).
import mdx from "@astrojs/mdx";
import sitemap from "@astrojs/sitemap";
import starlight from "@astrojs/starlight";
import { defineConfig } from "astro/config";
import remarkGfm from "remark-gfm";
import starlightLinksValidator from "starlight-links-validator";
const domain = process.env.DOMAIN ?? "cuckoo.warehack.ing";
const domain = process.env.DOMAIN ?? "escapement.warehack.ing";
export default defineConfig({
site: `https://${domain}`,
@ -99,7 +100,11 @@ export default defineConfig({
pagination: true,
lastUpdated: true,
}),
mdx(),
// GFM tables do NOT render in .mdx without this, even though they work fine
// in plain .md — Astro's remark-gfm doesn't reach the MDX pipeline here. The
// failure is silent and ugly: the table falls through as a paragraph of raw
// pipe characters. It shipped that way on the landing page. Don't remove.
mdx({ remarkPlugins: [remarkGfm] }),
sitemap(),
],
});

View File

@ -2,7 +2,7 @@
#
# Default (no --profile flag):
# prod-style — Caddy serves the built dist/. Use for production-like
# deploys (the public site at cuckoo.warehack.ing runs this).
# deploys (the public site at escapement.warehack.ing runs this).
#
# --profile dev:
# Astro dev server with HMR. Volume mounts on src/ so edits hot-reload.
@ -13,7 +13,7 @@
#
# Both services attach to the external `caddy` network and expose
# themselves to caddy-docker-proxy via labels. Edit DOMAIN in .env to
# switch between cuckoo.warehack.ing (prod) and cuckoo.l.warehack.ing
# switch between escapement.warehack.ing (prod) and escapement.l.warehack.ing
# (local-dev tier).
services:
@ -28,10 +28,16 @@ services:
networks:
- caddy
labels:
caddy: ${DOMAIN:-cuckoo.warehack.ing}
caddy: ${DOMAIN:-escapement.warehack.ing}
caddy.reverse_proxy: "{{upstreams 80}}"
# encode + gzip already in the container; let caddy pass through.
# The site was briefly live at cuckoo.warehack.ing before the rename. Keep
# the old host as a permanent redirect rather than letting any link that
# escaped rot. {uri} preserves the path, so deep links survive too.
caddy_1: cuckoo.warehack.ing
caddy_1.redir: https://escapement.warehack.ing{uri} permanent
docs-dev:
profiles: ["dev"]
build:
@ -41,7 +47,7 @@ services:
container_name: cuckoo-escapement-docs-dev
restart: unless-stopped
environment:
- DOMAIN=${DOMAIN:-cuckoo.l.warehack.ing}
- DOMAIN=${DOMAIN:-escapement.l.warehack.ing}
- ASTRO_TELEMETRY_DISABLED=1
volumes:
# Hot-reload bind mounts. node_modules stays inside the container
@ -53,7 +59,7 @@ services:
networks:
- caddy
labels:
caddy: ${DOMAIN:-cuckoo.l.warehack.ing}
caddy: ${DOMAIN:-escapement.l.warehack.ing}
caddy.reverse_proxy: "{{upstreams 4321}}"
# Vite HMR over WebSocket. Caddy's defaults close "idle" WS
# connections after ~10-15s; HMR doesn't send app-level pings, so

View File

@ -12,6 +12,7 @@
"@astrojs/sitemap": "^3.7.2",
"@astrojs/starlight": "^0.39.2",
"astro": "^6.3.1",
"remark-gfm": "^4.0.1",
"sharp": "^0.34.0",
"starlight-links-validator": "^0.24.0"
}

View File

@ -14,6 +14,7 @@
"@astrojs/sitemap": "^3.7.2",
"@astrojs/starlight": "^0.39.2",
"astro": "^6.3.1",
"remark-gfm": "^4.0.1",
"sharp": "^0.34.0",
"starlight-links-validator": "^0.24.0"
}