Puppy Program OS
PrototypeAutomated foster management platform for a national guide dog organization. Daily logging, behavioral alerts, and contextual content — replacing email chains and PDF manuals.
Demo access code: ZURI-LION-2026
At a Glance
- Role
- Product builder · systems designer
- Status
- Prototype — pilot-ready, Lions Foundation engagement (March 2026)
- Domain
- Animal welfare operations · nonprofit workflow SaaS
- Stack
- React · TypeScript · Supabase · PostgreSQL RLS · Vercel
- What I did
- Discovery interviews → operational mapping → workflow design → interactive prototype → pilot readiness
- Links
- Prototype (Demo access code: ZURI-LION-2026) · GitHub source
The Problem
A national guide dog organization in Canada runs a foster program where volunteer families raise puppies for 12–18 months before the dogs enter formal training. Coordinators manage dozens of foster families simultaneously, tracking puppy development, behavioral patterns, health events, and socialization milestones — mostly through email chains, PDF manuals, and manual check-ins.
The coordination overhead is significant. Fosters forget to report issues. Staff spend hours chasing updates. Behavioral problems go undetected for weeks because there's no structured data flowing from foster homes back to the organization. By the time a pattern surfaces, the intervention window has narrowed.
The brief: replace the static manual and email workflow with a structured digital system — daily logging, automated behavioral alerts, contextual learning content, and a staff dashboard that surfaces what needs attention without anyone having to ask.
System Design
Foster App (mobile-first)
Volunteer families log daily observations — potty training, feeding, behavior, health, socialization — through a chip-based input interface designed to complete in under 90 seconds. No typing, no forms. Content modules unlock progressively based on the puppy's age, replacing the static PDF manual.
Staff App (desktop-first)
Coordinators open their day to an auto-populated dashboard showing which puppies need attention, ranked by urgency. Alert badges, support queue counters, and foster compliance indicators are all live. Staff never need to ask “how is the puppy doing” — the data tells them before the foster does.
Core Loop
Foster saves daily log → Postgres triggers evaluate behavioral rules → alerts auto-generate if patterns match → staff see alerts on dashboard → staff intervene with protocol checklists → foster acknowledges and acts.
Design Artifacts
Interactive mockups generated during product planning.
Product Overview
Cover page, design system, UI components, alert rules, and data model.
Interactive UI Mockup
Tabbed prototype showing both Foster and Staff app screens. Click through to explore each role.
Alert Engine
Four behavioral rules run as Postgres triggers — not in application code. Deduplication via partial unique index guarantees one open alert per puppy per rule type.
| Rule | Condition | Severity |
|---|---|---|
| Missing socialization | No socialization logged for 8+ consecutive days (weeks 8–20) | Medium → High at 14 days |
| Jumping pattern | Jumping on 3 of last 5 log days | Medium |
| Potty regression | 2+ accidents/day for 3 consecutive days (age >18 weeks) | Medium |
| Health flag | Vomiting or diarrhea on 2 consecutive days | High (immediate) |
Architecture Decisions
| Decision | What | Why |
|---|---|---|
| Alert engine in Postgres | Triggers, not Edge Functions | Can’t be bypassed by frontend bugs, executes atomically with log save, deduplication via partial unique index |
| Append-only audit trail | INSERT-only on alert_events | Full history for every intervention — no UPDATE, no DELETE from app layer |
| Magic link auth | No passwords | Foster population is non-technical — password management would generate support tickets |
| Multi-tenant from day one | org_id on every table | Second organization can onboard without schema changes |
| RLS enforced at DB | Row-Level Security on all 18 tables | Organizations can never see each other’s data, even if frontend has bugs |
| Rule-based content | 46 modules with unlock conditions | Fosters see content when relevant, not a wall of PDFs. Staff add modules without a developer |
What Makes This Interesting
The 90-second constraint shaped everything
If the daily log takes longer than 90 seconds, foster compliance drops and the alert engine starves for data. The entire input design — chip-based taps instead of text fields, six sections with sensible defaults, one-thumb mobile layout — exists to protect that completion time. UX decisions are data pipeline decisions.
Domain knowledge mattered
I raised a puppy (Zuri) through the organization's foster program. That firsthand experience shaped the daily log structure, the alert thresholds, and the content unlock timing in ways that pure product research wouldn't have surfaced. Knowing that fosters check the app while holding a leash with one hand informed the 90-second, one-thumb design constraint.
Security in a non-profit context
PIPEDA-compliant data minimization: no medical records, no SIN, no financial data. React Query cache keys include orgId to prevent cross-org data bleed in shared browser sessions. Cache cleared on sign-out.
Tech Stack
| Frontend | React + TypeScript + Tailwind + shadcn/ui |
| Backend | Supabase (PostgreSQL + RLS + Triggers + Auth) |
| Deploy | Vercel (auto-deploy from main) |
| Auth | Supabase magic link (no passwords) |
| Alert Engine | Postgres triggers (fn_evaluate_all_rules) |
Data Model
organizations
↓
profiles (foster / staff / vet / org_admin)
↓
puppies → daily_logs → fn_evaluate_all_rules (trigger)
↓ ↓
content_modules alerts → alert_events (append-only)
(46 seeded, rule-based ↓
unlock by age/stage) support_tickets
↓
foster_stats + foster_achievementsCurrent Status
The prototype is live and was presented to program coordinators at the partner organization. The system was designed for a structured 1–2 month pilot with real foster workflows. 18 tables, 4 roles, RLS-enforced multi-tenancy, and a Postgres-native alert engine.