From 56097b6c591cd8a4e8c497b9ce7bedba5e76ba53 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 30 Jul 2026 23:42:15 +0000 Subject: [PATCH] =?UTF-8?q?ADR=200011=20ratified:=20Accepted=20=E2=80=94?= =?UTF-8?q?=20Cloudflare=20Workers=20it=20is?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Jacob aligned with the Cloudflare Workers plan; Status flipped to Accepted. NEXT queue collapses to two items (schema design, build v1 — with the oauth-client-node-on-Workers spike as v1's first scaffolding step). FEASIBILITY's open-questions list is now empty: the founding decision set is complete. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_014mXNfP5m9NhhjVgM5VVJ5E --- docs/FEASIBILITY.md | 2 +- docs/NEXT.md | 14 +++++--------- .../adr/0011-hosting-cloudflare-workers.md | 2 +- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/docs/FEASIBILITY.md b/docs/FEASIBILITY.md index bac4749..6f1f59b 100644 --- a/docs/FEASIBILITY.md +++ b/docs/FEASIBILITY.md @@ -83,4 +83,4 @@ Deferred to v2+: teal.fm, writing third-party lexicons, the pluggable translatio - ~~Product name~~ → decided: **Mooring** at mooring.page (PD-8; research in [`research/2026-07-30-naming.md`](research/2026-07-30-naming.md)). Trademark screen passed (2026-07-30; note appended to the naming file). Fahrenheit stays as codename. - ~~Our lexicon namespace NSID~~ → decided: `page.mooring.*` (ADR 0009). - ~~Tech stack~~ → decided: TypeScript + SvelteKit, first-party `@atproto/*`, direct PDS reads for v1 (ADR 0010; research in [`research/2026-07-30-language-ecosystems.md`](research/2026-07-30-language-ecosystems.md), [`-appview-infra.md`](research/2026-07-30-appview-infra.md), [`-comparable-stacks.md`](research/2026-07-30-comparable-stacks.md)). -- ~~Hosted infrastructure target and cost model~~ → ADR 0011 **Proposed** (2026-07-30, awaiting ratification): Cloudflare Workers + Cloudflare for SaaS; DB finalized SQLite-family (D1 hosted / file self-host); research in [`research/2026-07-30-hosting-infra.md`](research/2026-07-30-hosting-infra.md). +- ~~Hosted infrastructure target and cost model~~ → decided: Cloudflare Workers + Cloudflare for SaaS; DB finalized SQLite-family (D1 hosted / file self-host) (ADR 0011, accepted 2026-07-30; research in [`research/2026-07-30-hosting-infra.md`](research/2026-07-30-hosting-infra.md)). **No open questions remain — the founding decision set is complete.** diff --git a/docs/NEXT.md b/docs/NEXT.md index e481eda..12f8ebe 100644 --- a/docs/NEXT.md +++ b/docs/NEXT.md @@ -2,11 +2,11 @@ The flight plan. Each item carries enough context to start cold; update this file whenever an item lands (move it to "Done") or a new one is queued. Decisions made while working an item still go through `decisions/` as usual. -_Last updated: 2026-07-30 (hosting research + ADR 0011 proposed; TMview check recorded)._ +_Last updated: 2026-07-30 (ADR 0011 ratified — hosting + DB decided; TMview check recorded)._ ## Where things stand -Feasibility is done and the verdict was **build it** (see `FEASIBILITY.md`). All founding decisions are recorded: PD-1..8 in `decisions/product-decisions.md`, ADRs 0001–0010 in `decisions/adr/` — all Accepted, including ADR 0008 (v1 scope) and ADR 0010 (tech stack: TypeScript + SvelteKit, first-party `@atproto/*`, direct PDS reads for v1, BEAM benched for v2 services). The product is **Mooring** at **mooring.page** (domain secured); the repo keeps the codename Fahrenheit. No product code exists yet — scaffolding is unblocked but starts only on Jacob's explicit request. +Feasibility is done and the verdict was **build it** (see `FEASIBILITY.md`). All founding decisions are recorded: PD-1..8 in `decisions/product-decisions.md`, ADRs 0001–0011 in `decisions/adr/` — all Accepted, including ADR 0008 (v1 scope), ADR 0010 (tech stack: TypeScript + SvelteKit, first-party `@atproto/*`, direct PDS reads for v1, BEAM benched for v2 services), and ADR 0011 (hosting: Cloudflare Workers + Cloudflare for SaaS; DB: SQLite-family via D1 hosted / file self-host). The product is **Mooring** at **mooring.page** (domain secured); the repo keeps the codename Fahrenheit. No product code exists yet — scaffolding is unblocked but starts only on Jacob's explicit request. ## Queued, roughly in order @@ -14,13 +14,9 @@ Feasibility is done and the verdict was **build it** (see `FEASIBILITY.md`). All Design the record types for site config + authored pages + source bindings (ADR 0009 sketches `page.mooring.site` / `.page` / `.source` as starting points — not binding). Before shipping v1 records: review hard (schemas are effectively immutable once records exist in the wild — ADR 0004), check lexicon.community for prior art, publish on-network via `com.atproto.lexicon.schema`, and publish permission sets for our OAuth scopes (ADR 0007). Study `site.standard.*` and `id.sifa.*` for conventions (both linked in the lexicon research file). -### 2. Ratify ADR 0011 (hosting: Cloudflare Workers + for SaaS; DB: SQLite/D1) +### 2. Build v1 (per ADR 0008 — the scope is ratified; don't re-scope) -The research is done (`research/2026-07-30-hosting-infra.md`: Cloudflare vs Hetzner-VPS+Caddy vs Vercel vs Fly, costed at three scale tiers) and ADR 0011 is written as **Proposed**: Cloudflare Workers hosted target, D1 finalizing ADR 0010's provisional SQLite, VPS+Caddy as the documented self-host path, DID-in-TXT domain verification. Jacob reads, pushes back or ratifies (flip Status to Accepted). One named spike rides along: verify `@atproto/oauth-client-node` under Workers `nodejs_compat` before scaffolding commits (fallback: `@atcute`, already approved). (This was "hosted infrastructure target + cost model" — ADR 0010 calls it "NEXT item 5", its number at the time.) - -### 3. Build v1 (per ADR 0008 — the scope is ratified; don't re-scope) - -OAuth login → read-only adapters for Bluesky, standard.site (+ `pub.leaflet.*` legacy fallback), sifa → one professional-presence theme → authored pages/config in our lexicon → hosted, free subdomain, paid custom domain. Deferred list lives in the ADR; resist scope creep. +OAuth login → read-only adapters for Bluesky, standard.site (+ `pub.leaflet.*` legacy fallback), sifa → one professional-presence theme → authored pages/config in our lexicon → hosted on Cloudflare Workers (ADR 0011), free subdomain, paid custom domain. **First scaffolding step is the ADR 0011 spike:** verify `@atproto/oauth-client-node` under Workers `nodejs_compat`; fall back to `@atcute` (already approved, Blento-proven) if it doesn't fly. Deferred list lives in the ADR; resist scope creep. ## Standing / background @@ -31,7 +27,7 @@ OAuth login → read-only adapters for Bluesky, standard.site (+ `pub.leaflet.*` ## Done -- 2026-07-30 — Hosting research done, ADR 0011 **Proposed** (awaiting ratification): Cloudflare Workers + Cloudflare for SaaS as hosted target (~$5/mo launch, ~2%-of-revenue custom-domain COGS at scale); DB finalized SQLite-family (D1 hosted / file+Litestream self-host); VPS+Caddy (wisp.place recipe) as first-class self-host path; `_mooring. TXT did:…` verification. Fly.io ruled dominated; Vercel ruled out ($20 floor, DNS coupling, worst scale curve). Research: `research/2026-07-30-hosting-infra.md`. +- 2026-07-30 — Hosting decided: ADR 0011 **Accepted** (ratified by Jacob same day): Cloudflare Workers + Cloudflare for SaaS as hosted target (~$5/mo launch, ~2%-of-revenue custom-domain COGS at scale); DB finalized SQLite-family (D1 hosted / file+Litestream self-host — closes ADR 0010 §5's provisional note); VPS+Caddy (wisp.place recipe) as first-class self-host path; `_mooring. TXT did:…` verification. Ruled out: Fly.io (dominated), Vercel ($20 floor, DNS coupling, worst scale curve), Railway (20-domain/service cap, checked at Jacob's request). Research: `research/2026-07-30-hosting-infra.md`. - 2026-07-30 — Trademark screen on "Mooring": **passed**. US side clean — the only live software-class mark is "ONLINE MOORING" (boat-mooring ASP for harbormasters, different services); bare MOORING marks all dead. EU screened via secondary sources, then confirmed same day by Jacob's manual TMview check (classes 9/35/38/42 — clear); no residuals. Detail appended to `research/2026-07-30-naming.md`. Brand spend fully unblocked. - 2026-07-30 — Domain ops: auto-renew + registrar lock confirmed on **mooring.page** (Jacob). Defensive adjacent registrations remain optional/unpursued. - 2026-07-30 — Tech stack decided: ADR 0010 (TypeScript + SvelteKit core, first-party `@atproto/*`, direct PDS reads for v1 — no quickslice/HappyView, Tap named v2 liveness candidate, BEAM benched for v2 services). Research checkpoints: language ecosystems, AppView infra, comparable stacks. diff --git a/docs/decisions/adr/0011-hosting-cloudflare-workers.md b/docs/decisions/adr/0011-hosting-cloudflare-workers.md index c0be666..90e05c7 100644 --- a/docs/decisions/adr/0011-hosting-cloudflare-workers.md +++ b/docs/decisions/adr/0011-hosting-cloudflare-workers.md @@ -1,6 +1,6 @@ # ADR 0011: Hosted target — Cloudflare Workers + Cloudflare for SaaS; DB finalized as SQLite-family (D1 hosted / file self-host) -**Status:** Proposed · 2026-07-30 (awaiting Jacob's ratification) +**Status:** Accepted · 2026-07-30 (ratified by Jacob same day) ## Context -- 2.51.2