CRUMB a card from devarno-cloud

SMO1 Ecosystem Overview

smo1 beginner 5 min read

ELI5

SMO1 is a link shortener with a cat theme. Six projects share the work. A small program at the Cloudflare edge (zoomies-edge) answers every smo1.io/... request: it asks the API (purr-api) what a short code points to, then sends the visitor on. Anything that is not a short link is handed to the marketing site. Signed-in users manage their links in a separate dashboard (meow-web), which talks to the API on their behalf. Two support projects hold shared code and a local development stack.

Technical Deep Dive

Source: smo1-io/smo1-io CLAUDE.md:34-79 (origin/main 1f19667); zoomies-edge wrangler.toml:37-55 (5bdde59); purr-api cmd/server/main.go:82-122, 155-209 (bb6cfc2); meow-web README.md:63-69 (e5d808c); litter-box docker/ via smo1-io CLAUDE.md:72-79; public probes of smo1.io, purr.smo1.io, origin.smo1.io, app.smo1.io, petrova.smo1.io, read 2026-10-25.

Project inventory

Six co-located git repositories, not a monorepo.

ProjectStackProduction hostPurpose
zoomies-edgeHono on a Cloudflare Workerroutes smo1.io/* and petrova.smo1.io/*slug resolution, protection prompt, proxy mode, click forwarding, landing proxy
purr-apiGo 1.25, GinRailway, purr.smo1.io (Cloudflare-proxied) and purr-api-production.up.railway.appREST API: links, auth, analytics, billing, gamification, x402 paid create
meow-webNext.js 15.5, React 19Vercel, app.smo1.iodashboard; server-side BFF to purr-api
whiskers-landingNext.js 15.5, React 19Vercel, origin.smo1.io (DNS-only)marketing site the Worker proxies to
catnip-packagesTypeScript, pnpm workspacenone@smo1/types, @smo1/config, @smo1/utils, @smo1/guard
litter-boxDocker Composenonelocal Postgres 16, Redis 7, ClickHouse 24, Mailpit, Prometheus, Grafana

MinIO was removed from litter-box on 2026-10-21 (litter-box #16): its images stopped being pullable and nothing in smo1 reads object storage.

Request flow as deployed

flowchart LR
U[Visitor] -->|"smo1.io/slug"| Z[zoomies-edge Worker]
Z -->|"GET /api/links/resolve?host and slug"| P[purr-api on Railway]
Z -->|"POST /api/analytics/track"| P
Z -->|"non-slug paths"| W[whiskers-landing at origin.smo1.io]
Z -->|"302 Location"| U
D[Signed-in user] --> M[meow-web at app.smo1.io]
M -->|"/api/purr BFF with service JWT"| P
M -->|"handoff"| A[Airlock]
P --> PG[(Postgres)]
P --> R[(Redis)]
P -.->|"only if reachable"| CH[(ClickHouse)]

Three facts the old version of this card got wrong:

  1. The edge does not cache in production. The LINKS_CACHE KV binding is commented out in wrangler.toml:50-63 because purr-api writes bare-slug keys while the Worker reads link:{host}:{slug}. Every redirect goes to origin (see smo1-009, smo1-015).
  2. Auth is an Airlock JWT handoff, not OIDC. meow-web holds no OIDC client; the smo1 client was retired in airlock#112 (meow-web README.md:63-69). smo1-io CLAUDE.md:81-95 still says “OIDC/PKCE” and is stale on this point (see smo1-004, smo1-005).
  3. ClickHouse is optional at runtime. purr-api pings it at boot and falls back to a Postgres click store when the ping fails (main.go:116-122, 162-172). Whether production has ClickHouse is UNVERIFIED; the launch scope deferred provisioning it (M4.5).

Hostnames

mindmap
root((smo1 hosts))
smo1.io
Worker route
slugs and landing proxy
petrova.smo1.io
Worker route declared
DNS did not resolve 2026-10-25
purr.smo1.io
purr-api
Cloudflare proxied
origin.smo1.io
whiskers-landing
DNS only to Vercel
app.smo1.io
meow-web

petrova.smo1.io/* is in the [env.lion] routes (wrangler.toml:40-48) for petrova.codes artifact links (smo1-028). On 2026-10-25 the hostname returned no DNS answer, so the route exists in config but serves nothing yet.

Environment names

kitten = development (localhost), cat = staging, lion = production. Only --env lion is deployed (wrangler.toml:30-32).

Key Terms

  • zoomies-edge — the Cloudflare Worker that answers every request on the routed hostnames
  • purr-api — Go API; the single writer of users, links, billing state and achievements
  • meow-web — Next.js dashboard; reaches purr-api only through its /api/purr server-side proxy
  • whiskers-landing — marketing site, served to visitors through the Worker from origin.smo1.io
  • redirect mode — the Worker answers 302 with the destination
  • proxy mode — the Worker fetches the destination itself and streams it under the short URL

Q&A

Q: Name all six projects in the SMO1 workspace. A: zoomies-edge, purr-api, meow-web, whiskers-landing, catnip-packages and litter-box. The smo1-io repo itself is the governance root (docs, decisions, gates), not a seventh product project.

Q: Which project sits at the Cloudflare edge? A: zoomies-edge, deployed by wrangler deploy --env lion from its deploy-cloudflare.yml workflow on every push to main.

Q: What is the difference between a redirect-mode and proxy-mode link? A: A redirect-mode link gets a 302 to the destination, so the browser leaves smo1. A proxy-mode link is fetched by the Worker and streamed back while the address bar stays on smo1.io/<slug>/.... The mode is the links.redirect_mode column (smo1-016).

Q: Which hostnames does the edge Worker serve in production, and does the second one resolve today? A: smo1.io/* and petrova.smo1.io/* per wrangler.toml:40-48. petrova.smo1.io had no DNS record on 2026-10-25, so only the apex is live.

Examples

A visitor opens smo1.io/88mph. The Worker sees a single path segment with no dot, asks purr-api GET /api/links/resolve?host=smo1.io&slug=88mph, gets the link, fires a background POST /api/analytics/track, and answers 302 to the YouTube URL (probed 2026-10-25, about 0.3 s). A visitor opening smo1.io/pricing gets a 404 from the resolve call, so the Worker proxies the page from origin.smo1.io instead.

neighbors on the map