71 lines
4.0 KiB
Markdown
71 lines
4.0 KiB
Markdown
# 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) |