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.
| Project | Stack | Production host | Purpose |
|---|---|---|---|
zoomies-edge | Hono on a Cloudflare Worker | routes smo1.io/* and petrova.smo1.io/* | slug resolution, protection prompt, proxy mode, click forwarding, landing proxy |
purr-api | Go 1.25, Gin | Railway, purr.smo1.io (Cloudflare-proxied) and purr-api-production.up.railway.app | REST API: links, auth, analytics, billing, gamification, x402 paid create |
meow-web | Next.js 15.5, React 19 | Vercel, app.smo1.io | dashboard; server-side BFF to purr-api |
whiskers-landing | Next.js 15.5, React 19 | Vercel, origin.smo1.io (DNS-only) | marketing site the Worker proxies to |
catnip-packages | TypeScript, pnpm workspace | none | @smo1/types, @smo1/config, @smo1/utils, @smo1/guard |
litter-box | Docker Compose | none | local 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:
- The edge does not cache in production. The
LINKS_CACHEKV binding is commented out inwrangler.toml:50-63 because purr-api writes bare-slug keys while the Worker readslink:{host}:{slug}. Every redirect goes to origin (see smo1-009, smo1-015). - 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-ioCLAUDE.md:81-95 still says “OIDC/PKCE” and is stale on this point (see smo1-004, smo1-005). - 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-webpetrova.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/purrserver-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
- Deployment Topology, Proxy Conflict & CI after eu-1 finding where a smo1 component runs and how it deploys
- petrova.smo1.io: Custom-Domain Links for petrova.codes Artifacts provisioning or debugging petrova.smo1.io links
- Billing via TOLL: Decision Accepted, Polar Still in Code debugging why a user's tier did not update after payment