The explorer, its docs and its agent files now name explorer.twigpine.com
and node / node2 / node3.twigpine.com, and the proxy rules call the nodes
by those names. explorer.gitlawb.com forwards pages to the new address;
the API proxy, llms.txt, skill.md and the raw docs keep answering there.
The Manila node keeps its current address, and the documented node default
for ICAPTCHA_URL is unchanged because it is the value the node ships with.
/docs and /docs/:slug now rewrite to api/docs-page.ts, which swaps the
marker-delimited social-meta block in the built shell for per-section
title/description and the og-docs.png card (same mechanism as
repo-page; helpers deliberately duplicated so the prod-verified
repo-page stays untouched). Raw /docs/*.md is unaffected — the
filesystem is served before rewrites. DocsPage mirrors the titles
client-side during SPA navigation. Unknown slugs get hub metadata
without echoing the input.
Crawler-visible metadata for /repos/:owner/:name without turning the SPA
into an SSR app: a Vercel function fetches the built index.html, swaps
the marker-delimited social-meta block for repo-specific tags, and a
sibling function renders per-repo OG cards with @vercel/og (JetBrains
Mono TTFs; Satori can't consume WOFF2). Private repos and upstream
errors always get the generic site metadata plus noindex — repository
data is never interpolated on those paths. The client hook keeps
document meta in sync during SPA navigation, and the /api proxy narrows
to /api/v1 so local functions are reachable. Cache tiers: immutable
versioned OG URLs, 5m/1h SWR for pages, no-store on errors.
Expands the explorer from repos+agents into a full replacement for
gitlawb.com/node, with URL paths matching the old site 1:1 (minus the
/node prefix) so a single redirect covers the migration:
- / — node overview dashboard: identity, stat tiles, live activity
feed, agent-task summary, p2p status, quick clone
- /peers — searchable peer directory with live per-peer ping checks
- /events — node-level ref-update feed with local/gossip filter and
visibility-aware 30s auto-refresh
- /tasks + /tasks/:id — agent task queue with server-side status
filter, payload-derived titles, and pretty-printed payload/result
- /network — fan-out to the 4 federation nodes with per-node cards
and a replication-coverage table over their event feeds
Peer nodes serve no CORS headers, so node2/node3/manila get proxy
prefixes in vercel.json and the vite dev proxy. Section nav moves
from per-page tabs into the global layout.
Co-authored-by: Claude Fable 5 <[email protected]>
The Vite dev proxy (/api, /node-info → node.gitlawb.com) only exists in
the dev server, so the deployed static build 404'd every API call.
vercel.json now mirrors the proxy in production and adds an SPA fallback
so client-side routes survive refresh/deep links. Also ignores the
.vercel project-link directory.
Co-authored-by: Claude Fable 5 <[email protected]>