ADR-0022: A landing page at the site root; the workbench moves to /workbench/

Context

Rafa's words, verbatim:

"add the following prompt to the backlog to create a landing page for the goldfish (use the same site)"

"ok landing page now should be at npc.here.now/demo-goldfish deploy and move workbench to /demo-goldfish/workbench across the board"

The site was one page: the workbench, a spec and an engineering tool. Facilitators, the people Goldfish is for, need a page that says what it does for a session.

The landing page went through two rounds (01-concept/landing/):

Decision

  1. The site root is the landing page.
    • Its source is site/landing.src.html, with its assets in site/landing/: photos, the 3D model's data and the 404 page.
    • site/build.py --web writes it to site/web/index.html, along with js/gf.js (resolution.js and goldfish.js, unchanged, with the profile and locales).
  2. The workbench moves to site/web/workbench/.
    • Its shared folders stay at the root (files/, print/, assets/, r/). The web build rewrites its links one level up.
    • The phone reader stays at /r, the address the firmware writes to the tag (daemon.py READER).
    • The local build is unchanged: site/index.html is still the workbench.
  3. What the page says.
    • It sells a better session, not the device: "Have better conversations. Make better decisions."
    • The hardware appears only as proof, under "Good tech, without the hassle."
    • It uses the word "session" and US spelling.
    • It never makes claims the design can't keep. The note sentences are hand-written until the speech model exists, and the page says so next to every note it shows.
  4. What runs on the page.
    • The demos run the JS mirror of the firmware (goldfish.js, held bit for bit to the Python by the light-ring parity check).
    • The 3D model is the real CAD: the printed parts, the inner parts, the 50 LEDs and the 66 routed wires, packed by site/landing_model.py (run it after a CAD change; the web build warns when it is stale).
  5. Links that go nowhere yet (tech specs, support, company pages) go to an on-brand 404 page.
  6. The sign-up form sends nothing. The rafa-inbox Worker route (POST /goldfish/presale) is not built. Changing that Worker is Rafa's call.

Consequences

# ADR-0022: A landing page at the site root; the workbench moves to /workbench/

- **Status:** accepted (2026-10-15)
- **Date:** 2026-10-15
- **Requirements touched:** the site (B-74)
- **Builds on:** ADR-0019 (firmware in the site)

## Context

Rafa's words, verbatim:

> "add the following prompt to the backlog to create a landing page for the goldfish (use the same site)"

> "ok landing page now should be at npc.here.now/demo-goldfish deploy and move workbench to /demo-goldfish/workbench across the board"

The site was one page: the workbench, a spec and an engineering tool. Facilitators, the people Goldfish is for, need a page that says what it does for a session.

The landing page went through two rounds (`01-concept/landing/`):
- **Round 1** led with the hardware and was rejected.
- **Round 2** was rebuilt from facilitators' own words: 361 verbatim quotes in `01-concept/landing/research/voice/`, plus a study of how competitors and neighbouring products position themselves. It was then written as a copy deck (`01-concept/landing/copy-deck.md`) that Rafa approved before any layout.

## Decision

1. **The site root is the landing page.**
   - Its source is `site/landing.src.html`, with its assets in `site/landing/`: photos, the 3D model's data and the 404 page.
   - `site/build.py --web` writes it to `site/web/index.html`, along with `js/gf.js` (resolution.js and goldfish.js, unchanged, with the profile and locales).
2. **The workbench moves to `site/web/workbench/`.**
   - Its shared folders stay at the root (`files/`, `print/`, `assets/`, `r/`). The web build rewrites its links one level up.
   - The phone reader stays at `/r`, the address the firmware writes to the tag (`daemon.py` READER).
   - The local build is unchanged: `site/index.html` is still the workbench.
3. **What the page says.**
   - It sells a better session, not the device: "Have better conversations. Make better decisions."
   - The hardware appears only as proof, under "Good tech, without the hassle."
   - It uses the word "session" and US spelling.
   - It never makes claims the design can't keep. The note sentences are hand-written until the speech model exists, and the page says so next to every note it shows.
4. **What runs on the page.**
   - The demos run the JS mirror of the firmware (goldfish.js, held bit for bit to the Python by the light-ring parity check).
   - The 3D model is the real CAD: the printed parts, the inner parts, the 50 LEDs and the 66 routed wires, packed by `site/landing_model.py` (run it after a CAD change; the web build warns when it is stale).
5. **Links that go nowhere yet** (tech specs, support, company pages) go to an on-brand 404 page.
6. **The sign-up form sends nothing.** The `rafa-inbox` Worker route (`POST /goldfish/presale`) is not built. Changing that Worker is Rafa's call.

## Consequences

- **Photos.** The page uses free stock photos (Unsplash and Pexels licenses, checked on each photo's page; `site/landing/photos/PHOTOS.md`). A shoot with real facilitators should replace them before launch.
- **Placeholders.** Price, ship date, how long sign-ups are kept, and the Worker URL are marked [LIKE THIS] on the page.
- **The GitHub link** points at a private repository until Rafa makes it public.