41 lines
2.1 KiB
Markdown
41 lines
2.1 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.
|
||
|
||
## 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 `+`.
|
||
|
||
## Links
|
||
|
||
- [[210 AI Resume]] · [[220 Web Host Migration]] · [[240 Web Sites]] |