Files
obsidian-vault/200 projects/240 Web Sites/Where Woof.md

2.1 KiB
Raw Blame History

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 in db/schema.sql.
  • Deploy: per-file rsync --checksum to .13 + systemd/docker restart. Gitea sam/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)

  • /order page 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 +.