# Where Woof > Return-tag platform: QR/NFC tags on valuables; finder scans → owner gets SMS with map link. Go + HTMX frontend, Laravel/Filament admin, shared Postgres, Stripe AU billing. ## One-line Every valuable deserves a way home: a $5 tag, a $10/yr account, and when the tag is scanned you get an SMS with the finder's map link. ## Where things live (the 5 tools) | Tool | What it holds | Where | |---|---|---| | **Gitea** | Source + git history | `sam/where_woof` — ssh://git@gitea.lab.audasmedia.com.au:2222/sam/where_woof.git | | **Vikunja** | Project tasks, done/todo, priorities | Project **"Where Woof"** (id 7) — vikunja.lab.audasmedia.com.au | | **Outline** | Project docs for AI bots (overview, architecture, configs, schema, status) | Collection **"Where Woof"** — outline.lab.audasmedia.com.au | | **Obsidian** | This note — human understanding | 200 projects / 240 Web Sites / Where Woof.md | | **OpenSpec** | Change proposals (proposal/design/specs/tasks) + plans | `openspec/changes/*` + `plans/*.md` in repo | **How they relate:** Vikunja = *what to do* (tasks). Outline = *what/why/how* for AI agents. Obsidian = *human brain* reference. OpenSpec = *design decisions* per feature. Gitea = *the code itself*. ## Map - **Interactive flow map** (where-woof.com): https://maps.lab.audasmedia.com.au/where_woof/docs/diagrams/where-woof-flow.html - Mermaid + PNG/SVG: `docs/where-woof-flow.mmd`, `docs/diagrams/` (repo + maps site) ## Status (2026-09-05) - **LIVE**: frontend where-woof.com (.13:3020) · admin admin.where-woof.com (.13:3031) - **Done**: phases 1–8 + billing (Phase 5) + promo (order page, banner, contact form) - **Blocking**: Stripe **go-live** (test mode only now — no real sales) · SES production access + incoming hello@ routing ## Billing model (locked) - **Account = the product**: $10/yr flat, up to **25 tags**, **50 SMS/yr included**; extra SMS $0.10 (100-credit pack = $10). - **Tags one-time**: single **$5 + GST** ($5.50) · 10-pack **$20 + GST** ($22.00). Cost ~$1/tag to make. - **Replacement tags**: new SKU $5 one-time, annual sub continues untouched. - **Business/public-info deferred**: `plans.plan_type='business'` reserved (scan-volume tiers, no SMS). ## Stack / infra - **Frontend**: Go `net/http`, sqlc/pgx, HTMX/Apline/Tailwind — `.13:3020` systemd user service. - **Admin**: Laravel 13 + Filament 3 + Cashier 16 (Stripe AU) — `.13:3031` Docker. - **DB**: Postgres `.13:5434` (`wherewoof`), schema canonical `db/schema.sql`. - **SMS**: SMSGlobal HTTP API — **live creds set on .13** (`SMS_USER/PASSWORD/FROM`). - **Email**: Amazon SES (ap-southeast-2) transactional only, sends as `hello@where-woof.com`, contact form → samuelrolfe@gmail.com. **Sandbox** until production access approved. - **Storage**: MinIO on .13:9010 for tag photos. - **Ordering**: Stripe Payment Links (test mode) on `/order`. ## Key configs (env-only, never committed) - `.13 ~/.config/where-woof.env` — frontend: DATABASE_URL, SMS_*, SMTP_*, STRIPE_*, ORDER_*_LINK, BILLING_ENABLED, SMS_INCLUDED_PER_YEAR - `.13 ~/Docker/Containers/wherewoof-admin/.env` — admin: DB_*, STRIPE_* (test), CASHIER_CURRENCY - **Secrets live only on .13 — never paste into chat or commit.** ## Gotchas - Laravel login: `User::$authPasswordName = 'password_hash'` (Laravel 13 rehash-on-login). - Cashier/Stripe: Managed Payments needs `tax_code` → `txcd_10103001` (SaaS) — Tangible Goods rejected. - curl `-F "phone=%2B..."` stores literal `%2B` — use real `+`. - Vikunja token intermittently 401s — retry once. - Outline public API returns 502 (Caddy route missing) — use `http://192.168.20.13:3000/api` directly. ## Next up (see Vikunja project 7) 1. **GO LIVE Stripe** (urgent — blocks real sales) 2. SES production approval + Cloudflare Email Routing (incoming hello@) 3. Photo uploads (Phase 6), anti-abuse (Phase 9), customer insights dashboard ## Links [[210 AI Resume]] · [[220 Web Host Migration]] · [[240 Web Sites]] · [Vikunja: Where Woof](https://vikunja.lab.audasmedia.com.au) · [Outline: Where Woof](https://outline.lab.audasmedia.com.au)