Landing backends

Where the 2026 landing pages live, and where their large data is served from
Published

October 10, 2026

The landing cards on the platform hub are the checklist. Each public card opens a static page on GitHub Pages. A click that opens an edition, the sundial repository, or a Famulus notebook leaves that page and goes to lettre.ngrok.dev. Today that name ends on this Mac Studio. ae-platform porter is the switch that moves it to openscience, and it refuses to move until that machine answers.

Measured on 10 October 2026, by platform/scripts/landings_probe.py. The addresses live in platform/config/landings.yaml. openscience is still not in the path: its Tailscale node key has expired, so SSH times out and porter use openscience stops before it touches the tunnel.

Topology

flowchart LR
  hub["Hub Landings"] --> pages["GitHub Pages"]
  pages -->|"edition link"| ngrok["lettre.ngrok.dev"]
  ngrok --> proxy["mac-studio proxy :5001"]
  proxy --> disk["PDAI-1 on mac-studio"]
  drive["Google Drive mirror"] -.-> sci["openscience"]
  sci -.-> proxy

The solid path is the one that answered. The dotted path is the intended one. It is not in service.

Hop Measured state
Hub Landings http://127.0.0.1:5050/landings2026 returned 200
GitHub Pages Every public card returned 200
ngrok to mac-studio The same edition path on 127.0.0.1:5001 returned the same status as lettre.ngrok.dev
PDAI-1 The viewers that answered are the processes on this Mac, reading the local volume
Google Drive Account gerd.grasshoff@gmail.com is mirroring /Volumes/PDAI-1/pdai-collections. About 56,600 items were indexed, about 38,400 were still queued, and about 3.1 GB had matching cloud sizes. The local Drive content cache was 48 KB
openscience Unverified. No SSH path

Drive is also mirroring Desktop, Documents, Downloads, and ~/ai-mac-studio. Those four folders share the Google One quota and the upload with the 781 GB of collections.

Control of the landing cards

A page is externally working when its GitHub page answers and every edition link behind it answers on lettre.ngrok.dev, including the leaf a p= link names. The same path on mac-studio.tail147011.ts.net answered with the same status for every row. X-Served-By was mac-studio. No page is served by openscience.

Page Public page Edition on ngrok Result
Übersicht famulus.lettre.ai/editions/ the hub page The list of the rows below
Euler 200 200 /euler-opera/, /viewer/, /euler-oo-iv/ External
Kepler 200 200, including both Famulus notebooks External
Brahe 200 brahe-2026 200 /brahe-oo/ External. The page now links the viewer
Kármán 200 200 /karman/ External
Kopernikus 200 200 /copernicus/ External
Babylon 200 200 /diaries/ External
Ancient Sundials 200 200 /sundials/overview, literature, animator External
Sonnenuhren, deutsch 200 200 /sundials/overview External
Kausalität 200 the page is the site External
Bischoff 200 200 /medieval-sec/Bischoff1998?p=30, leaf present External
Wittgenstein, Mechanik 200 200 Hertz and Reuleaux, p=30, 6 documents External. Viewer added on port 5132
Tractatus-Typoskripte 200 200 GrasshoffLampert2003?p=11, leaf present External. Viewer added on port 5133
Kepleriana 200 200 facsimile and both notebooks External
Hevelius not on GitHub Pages 200 /hevelius/ on ngrok and Tailscale On this machine. Brepols
Publikationen not on GitHub Pages 200 on the hub On this machine. Drafts
Mitanni not published 200 /mitanni/ and /waefler/ The site answers. GitHub Pages was not created: the page states no licence for its photographs
Editions index not a GitHub page 200 /editions/ External via ngrok only
Wasseruhren no landing 200 /waterclocks/, 1 document Viewer added on port 5134

Nineteen edition routes in the register, including Eneström, Euler Opera Omnia, Euler IVA, Kepler, Copernicus, Wäfler, Pirckheimer, Kirch, the Diaries and the Kármán Nachlass, answered on ngrok and on Tailscale.

Reading through the lake (planned)

The landing builds in scholarly/projects/landings2026/ open collection DuckDB files directly. With the DuckLake they will read through the lake:

Change State
facts/common.py db() resolves a lake: prefix (e.g. lake:kirch.fr_document) to a read-only attach of the lake read replica planned
each landing build records the lake snapshot id in its manifest.json; that snapshot is pinned as a release in fr_release and never expired planned
landing DBs (e.g. eulerOO-IVA letters_reference) move into lake schema landing planned (migration)

Until then the landings read the existing files.

Operational setup

Public HTML stays on GitHub Pages. Hevelius and the publication drafts stay on the hub. Edition links stay on lettre.ngrok.dev. ae-platform porter status prints which machine answers. ae-platform porter use openscience checks Tailscale, SSH, the proxy on that machine, and an INQUA route back to 100.102.189.23 before it stops the tunnel here. If the check after the move fails, it starts the tunnel here again. Until the openscience node key is renewed, the command stops at the first check.

Famulus Notebook was down because Syncthing had replaced its virtualenv scripts with a Mac mini Python. The virtualenv was rebuilt, .venv is ignored on both machines, and both notebook links render.

Edition backends on openscience (from 16 October 2026)

The viewers, the editions landing (/editions), glider (/glider, /lemma-search) and the Kármán archive (/karman) run only on openscience, under one launchd job, com.ai-platform.editions (platform/scripts/editions_supervisor.py). They listen on all interfaces. Their 27 routes in routes.yaml carry host: 100.87.180.115, so the proxy on mac-studio, which carries the tunnel, reaches them over Tailscale, and the proxy on openscience reaches them on loopback. Only mac-studio runs ngrok; the agent, config and binary were removed from openscience on 16 October, so porter use openscience now stops at its preflight. A route edit reloads both proxies; neither needs a restart.

On 16 October /karman/ answered 502 on lettre.ngrok.dev: the tunnel sat on mac-studio, whose proxy looked for port 5725 on its own localhost, where nothing ran. The host: field closes that gap for every edition route at once.

The supervisor respawns an exited child with a doubling backoff (10 s to 5 min). It kills a child that is alive but fails four HTTP probes in a row and frees ports held by orphans of an earlier run. It writes its state to ~/Library/Application Support/ai-platform/editions/state.json on openscience.

platform/scripts/editionsctl.py is the control. It runs on both machines; on mac-studio it forwards over SSH to openscience@100.87.180.115 with ~/.ssh/id_rsa_ai_notebook.

Command Effect
editionsctl.py status [--public] [-v] every child with pid, health, uptime, restarts; --public adds the ngrok status per route
editionsctl.py restart karman restarts one child in place (karman reloads its data); all restarts every child
editionsctl.py stop NAME / start NAME stop persists across supervisor restarts until start
editionsctl.py refresh [NAME] restarts NAME, reloads routes on both proxies, then runs check
editionsctl.py check every openscience route through the openscience proxy, the mac-studio proxy and lettre.ngrok.dev
editionsctl.py logs NAME [-n 200] [-f] tails a child log; supervisor tails the supervisor log
editionsctl.py supervisor restart restarts the launchd job and reloads the supervisor code
editionsctl.py tunnel which machine answers on lettre.ngrok.dev

On mac-studio: python3 ~/ai-mac-studio/platform/scripts/editionsctl.py status. Names also accept the route, such as /karman or kepler-gw. The exit code is non-zero if anything is down.

This page is served by the hub from platform/docs/_site at /docs/landing-backends.html. It has not been copied onto openscience.