2.1 KiB
2.1 KiB
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.
Project state (2026-08-28)
Live: frontend where-woof.com (.13:3020) · admin admin.where-woof.com (.13:3031)
Phases done: foundation, scan flow (real SMS via SMSGlobal), hardening, HTMX polish, admin, deploy, billing (Phase 5) — account-based annual sub.
Billing model (locked with owner)
- Account = the product: $10/yr flat, up to 25 tags, 50 SMS/yr included; extra SMS $0.10 each (100-credit pack = $10).
- Tags one-time: single $5 + GST ($5.50), 10-pack $20 + GST ($22.00). Cost ~$1 to make.
- Replacement tags: new SKU $5 one-time, annual sub continues untouched. Move mechanic already built (source→closed, unset target→active).
- Business/public-info model deferred (scan-volume tiers, no SMS) —
plans.plan_type='business'reserved. - Sandbox-first: Stripe test mode verified e2e; live keys pending onboarding.
Stack / infra
- Frontend: Go
net/http, sqlc/pgx, HTMX/Alpine/Tailwind. Admin: Laravel 13 + Filament 3 + Cashier 16 (Stripe AU). - Shared Postgres on .13:5434 (
wherewoof), schema canonical indb/schema.sql. - Deploy: per-file
rsync --checksumto .13 + systemd/docker restart. Giteasam/where_woof. - SMS: SMSGlobal HTTP API (
SMS_USER/PASSWORD/FROM) — live creds are set on .13. - Email: Gmail SMTP → samuelrolfe@gmail.com (app password, env-only). hello@where-woof.com = public contact (Cloudflare/SES planned).
Promo (2026-08-28)
/orderpage with Stripe Payment Links (test mode): single 1–25 qty, 10-pack 1–2.- Red banner across all pages: "Protect & recover your valuables — ORDER NOW".
- Contact form → Gmail SMTP.
Gotchas
- Laravel login:
User::$authPasswordName = 'password_hash'(Laravel 13 rehash-on-login writes the wrong column otherwise). - Cashier: Managed Payments requires
tax_code→txcd_10103001(SaaS) is eligible. - curl
-F "phone=%2B..."stores literal%2B— use real+.