# Where Woof — Toolchain

Everything used to build and run the project, with where it fits.

## Product stack (public site — "GOAT")

| Tool | Version | Used for |
|---|---|---|
| Go | 1.26 | Frontend: stdlib `net/http` (no framework), `html/template`, Go 1.22+ ServeMux routing |
| HTMX | 1.9.12 | Inline editing, account panel swaps, contact forms (no page reloads) |
| Alpine.js | 3.x | Live phone validation, small client behaviours |
| Tailwind CSS | CDN | Utility-first styling (swap to a build step in Phase 3 polish later) |
| Postgres | 16 | Single shared database (`wherewoof-db` on .13) |
| pgx | v5 | Postgres driver + pool for Go |
| sqlc | 1.31.1 | Type-safe query generation from SQL (compiled-checked queries) |
| gorilla/sessions | — | Signed cookie sessions |
| bcrypt | — | Password hashing |

## Admin stack

| Tool | Version | Used for |
|---|---|---|
| Laravel | 13 (PHP 8.3) | Admin backend; Eloquent reads the shared Postgres schema |
| Filament | v3 | Admin panel UI: CRUD resources (User/Tag/Product/Order), dashboard widgets |
| Livewire | (Filament dep) | Reactive admin pages |
| Docker | — | Laravel dev (.27:3030) + prod (.13:3031); Postgres container |

## Infrastructure & deployment

| Tool | Role |
|---|---|
| NixOS | .27/.13/.51 hosts; systemd user services; firewall via config |
| systemd | `where-woof.service` (frontend, auto-restart, linger) |
| Docker Compose | Postgres, admin, other services |
| Caddy | Reverse proxy + TLS on .35 (public domains) |
| Pi-hole | Local DNS (`.home.lab` domains) |
| rsync | Deploy artifacts to .13 |
| Gitea | Git hosting (`sam/where_woof`) |

## SMS

| Tool | Role |
|---|---|
| SMSGlobal HTTP API | Live SMS (`api.smsglobal.com/http-api.php`, action=sendsms) — verified number as sender |
| `internal/sms` (Go) | Swappable `Sender` interface: `LogSender` (dev), `HTTPClient` (live), `smsglobal` REST client (unused fallback) |

## Development workflow

| Tool | Role |
|---|---|
| OpenSpec | Spec-driven development: `openspec/changes/*` (proposal → design → specs → tasks), validated |
| plannotator | Plan review (browser UI) for the first two phases |
| pi subagents | Master/worker delegation: `database`, `coder-pro`, `code-analysis`, `devops` |
| Makefile | `db-up`, `seed`, `seed-registry`, `run`, `build`, `generate`, `psql` |
| Verify suites | `/tmp/verify.sh` (22 checks), `verify2.sh` (19), `verify3.sh` (12) — HTTP-level regression tests |

## Security tooling (guards package installs)

SafeDep Vet (`vet`), npq (typosquatting), Socket Firewall (`socket`) — the npm-security skill wraps installs.

## Notes / gotchas (hard-won)

- Filament v3: production 403 unless the User model implements `FilamentUser`.
- Behind Caddy, force `URL::forceScheme('https')` to avoid mixed-content asset blocks.
- sqlc: nullable columns → `pgtype.*`; explicit INSERT column lists must include new columns.
- NixOS: `CGO_ENABLED=0` for Go builds (no gcc); `make` via nix profile; `psql` via `docker exec`.
- Admin files created by Docker are root-owned — edit via `docker cp`.
