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.** **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 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 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, <!-- 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 or why this box is a Pi and not an appliance, deserves one click to
the write-up rather than a search. --> 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 How this clock works
<svg viewBox="0 0 16 16" aria-hidden="true"><path d="M4 8h7M8 5l3 3-3 3"/></svg> <svg viewBox="0 0 16 16" aria-hidden="true"><path d="M4 8h7M8 5l3 3-3 3"/></svg>
</a> </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 * 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 * 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 * 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. * recolored from brass to this dashboard's cyan.
*/ */
.ss-plate__link { .ss-plate__link {

View File

@ -4,6 +4,6 @@
COMPOSE_PROJECT_NAME=cuckoo-escapement-docs COMPOSE_PROJECT_NAME=cuckoo-escapement-docs
# Production: cuckoo.warehack.ing # Production: escapement.warehack.ing
# Local dev: cuckoo.l.warehack.ing (internal only — never reference publicly) # Local dev: escapement.l.warehack.ing (internal only — never reference publicly)
DOMAIN=cuckoo.warehack.ing 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)" @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" ssh -A $(DEPLOY_HOST) "cd $(DEPLOY_PATH) && git fetch origin main && git reset --hard origin/main && cd docs-site && make prod"
@echo "==> sanity check" @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 // when the dev server runs behind Caddy (TLS-terminating proxy) — without an
// explicit host/protocol/clientPort, Vite's WebSocket drops every ~10s. // explicit host/protocol/clientPort, Vite's WebSocket drops every ~10s.
// //
// Site URL comes from DOMAIN so one image serves both cuckoo.warehack.ing (prod) // Site URL comes from DOMAIN so one image serves both escapement.warehack.ing (prod)
// and cuckoo.l.warehack.ing (local dev). // and escapement.l.warehack.ing (local dev).
import mdx from "@astrojs/mdx"; import mdx from "@astrojs/mdx";
import sitemap from "@astrojs/sitemap"; import sitemap from "@astrojs/sitemap";
import starlight from "@astrojs/starlight"; import starlight from "@astrojs/starlight";
import { defineConfig } from "astro/config"; import { defineConfig } from "astro/config";
import remarkGfm from "remark-gfm";
import starlightLinksValidator from "starlight-links-validator"; 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({ export default defineConfig({
site: `https://${domain}`, site: `https://${domain}`,
@ -99,7 +100,11 @@ export default defineConfig({
pagination: true, pagination: true,
lastUpdated: 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(), sitemap(),
], ],
}); });

View File

@ -2,7 +2,7 @@
# #
# Default (no --profile flag): # Default (no --profile flag):
# prod-style — Caddy serves the built dist/. Use for production-like # 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: # --profile dev:
# Astro dev server with HMR. Volume mounts on src/ so edits hot-reload. # 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 # Both services attach to the external `caddy` network and expose
# themselves to caddy-docker-proxy via labels. Edit DOMAIN in .env to # 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). # (local-dev tier).
services: services:
@ -28,10 +28,16 @@ services:
networks: networks:
- caddy - caddy
labels: labels:
caddy: ${DOMAIN:-cuckoo.warehack.ing} caddy: ${DOMAIN:-escapement.warehack.ing}
caddy.reverse_proxy: "{{upstreams 80}}" caddy.reverse_proxy: "{{upstreams 80}}"
# encode + gzip already in the container; let caddy pass through. # 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: docs-dev:
profiles: ["dev"] profiles: ["dev"]
build: build:
@ -41,7 +47,7 @@ services:
container_name: cuckoo-escapement-docs-dev container_name: cuckoo-escapement-docs-dev
restart: unless-stopped restart: unless-stopped
environment: environment:
- DOMAIN=${DOMAIN:-cuckoo.l.warehack.ing} - DOMAIN=${DOMAIN:-escapement.l.warehack.ing}
- ASTRO_TELEMETRY_DISABLED=1 - ASTRO_TELEMETRY_DISABLED=1
volumes: volumes:
# Hot-reload bind mounts. node_modules stays inside the container # Hot-reload bind mounts. node_modules stays inside the container
@ -53,7 +59,7 @@ services:
networks: networks:
- caddy - caddy
labels: labels:
caddy: ${DOMAIN:-cuckoo.l.warehack.ing} caddy: ${DOMAIN:-escapement.l.warehack.ing}
caddy.reverse_proxy: "{{upstreams 4321}}" caddy.reverse_proxy: "{{upstreams 4321}}"
# Vite HMR over WebSocket. Caddy's defaults close "idle" WS # Vite HMR over WebSocket. Caddy's defaults close "idle" WS
# connections after ~10-15s; HMR doesn't send app-level pings, so # connections after ~10-15s; HMR doesn't send app-level pings, so

View File

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

View File

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