From d2d8c55d469e3d8fc5d968fa27fb65a2dadc01c5 Mon Sep 17 00:00:00 2001 From: tonym Date: Wed, 14 Oct 2026 11:23:49 -0500 Subject: [PATCH] =?UTF-8?q?docs:=20CLAUDE.md=20=E2=80=94=20OTM=20fork=20co?= =?UTF-8?q?ntext=20+=20the=20first-party-app=20plan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_014LCQmFvKshyAJsE8C3B5ET --- CLAUDE.md | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..0d59f13 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,58 @@ +# 13ft — OTM's fork + +A self-hosted "read the article" fetcher (Python/Flask + gunicorn, ~200 lines +in `app/` (`portable.py` is the entrypoint)): it refetches a URL as Googlebot and serves the page +without the paywall/ad cruft. Forked 2026-10-14 from +[wasi-master/13ft](https://github.com/wasi-master/13ft) (the original project +was taken down once already — wasm-fyi → wasi-master — which is WHY we hold a +fork, not a dependency on GitHub/Docker Hub). + +- **Remotes:** `gitea` = `tonym/13ft` on git.poweredbyotm.com (ours, push here); + `upstream` = GitHub wasi-master/13ft (pull only: `git fetch upstream && git + merge upstream/main`). Token for Gitea lives in `~/Projects/CLAUDE.md`. +- **Running today:** https://13ft.poweredbyotm.com on **anvil**, hand-provisioned + from the STOCK image `wasimaster/13ft:latest` (0.3.4) via + `platform/infra/13ft/setup-13ft-anvil.sh` (platform#91, closed) — a + `/srv/otm/clients/13ft/` compose stack + Caddy site with **basic auth** + (user `tony`; password root-only in `/srv/otm/clients/13ft/secrets/basic-auth.txt`). + Nothing in this repo is deployed yet. + +## Where this is going (the reason for the fork) + +Make it a proper **OTM first-party app** per +`platform/docs/first-party-app-guide.md` (house rules are CI-enforced by +`platform/test/first-party-house-rules.test.ts`): + +1. **Build from this repo** — catalogue entry in + `platform/apps/otm-admin/lib/first-party-apps.ts` (`id: "13ft"`, repo + `tonym/13ft`, image `platform-13ft:latest`, port 5000, `hostname: + 13ft.poweredbyotm.com`), then `build_app 13ft` / `deploy_app 13ft` via the + platform MCP. **First: destroy or rename the hand-provisioned `13ft` stack** + (same slug + hostname + container name) or the two will fight over the + Caddy site and the container name. +2. **Sign in with OTM** replaces Caddy basic auth: `needsAuthSecret` → + `OTM_SSO_SECRET`; add `/api/auth/otm-sso` (verify the HS256 ticket for aud + `app:13ft` — port `pickup/src/sso.js`, or in Python: HMAC-SHA256 over + `header.payload`, base64url, check `exp`/`aud`/`jti`, single-use) and a + session cookie; gate every fetch route on it. Grant-only (NOT + `publicAccess`) — a stranger's OTM account must not get a free fetch proxy. +3. **tides** (`needsAnalytics`) — the beacon `