Product Overview · Pilot Edition
Puppy Program OS
A mobile-first platform replacing static foster manuals with contextual learning, daily logging, and an automated behavioural alert engine — built for a national guide dog organization.
👤 Foster App — mobile-first
🖥 Staff App — desktop
Design Preview
See what the full product experience looks like
If you prefer a visual-first review before the interactive walkthrough, open the UI/UX design file for a faster orientation of layout, tone, and workflow direction.
18
Database tables with RLS
90s
Target log completion time
Part 1
Foster View
Fosters access the app on their phone. The experience is designed to be completable in under 90 seconds per day — a daily log, contextual learning, and a direct line to staff support. No PDF manuals. No email chains.
Foster onboarding → daily workflow
📧
Magic link
Email, no password
→
👤
Setup profile
Name only
→
🏠
Home screen
Puppy assigned
→
🔔
Alerts surface
Auto-generated
→
📚
Content unlocks
By age + placement
Good morning, Luke 👋
Zuri · 31 weeks · GoldenLab · Female
🔥 4-day streak
⚠️
Jumping pattern flagged by staff
Review recommended actions →
medium
Milestones
✓ Sit
✓ Stay
○ Down — in progress
!
Alert banner — auto-generated when a behavioural pattern is detected in log data. Fosters see it; staff saw it first.
✓
Streak counter — gamification layer that rewards daily consistency. Drives log completion rate.
1
Today's log CTA — persistent prompt if no log submitted today. Disappears after save.
2
Milestone tracker — staff-managed milestones visible to foster. Read-only from foster side.
Daily Log — the core workflow
←
Daily Log — Zuri
March 18, 2026
🍽 Feeding
2× meals
1× meal
Refused food
🐾 Behaviour
Jumping
Mouthing
Pulling
Barking
❤ Health
Healthy
Vomiting
Diarrhea
Save Daily Log ✓
1
Chip-based input — fosters tap chips, not text. Designed for one-thumb mobile use under 90 seconds.
!
Behaviour chips (amber) — when jumping is selected 3 of 5 days, a Postgres trigger fires and creates an alert automatically — no staff manual review needed.
!
Health chips (red) — if vomiting or diarrhea selected 2 consecutive days, a HIGH severity alert is raised immediately.
✓
Unique per day — database enforces UNIQUE(puppy_id, log_date). Fosters can re-save the same day to correct entries — no duplicates created.
📚
Content library
46 modules unlock progressively based on Zuri's age and days since placement. CRITICAL urgency modules (vaccination, Day 0 checklist) surface at the top automatically. Fosters never see a wall of content.
🎧
Support tickets
Foster submits a structured request (category + priority + description). Ticket appears immediately in staff Support Queue. Priority levels: Low, Medium, High, Emergency. No email needed.
🔔
Alerts (foster view)
Fosters see their own alerts with plain-language explanations and recommended actions. They can acknowledge and ask follow-up questions directly from the alert card.
🏆
Gamification
Log streaks, points, and badge achievements (Group 10 — built next). Drives consistent daily log completion, which is the primary data source for the alert engine.
Part 2
Staff View
Staff access a desktop-first dashboard. The goal: reduce coordinator time spent chasing fosters for updates. Everything a coordinator needs to see — puppy status, alerts, support tickets, foster compliance — is surfaced automatically from the data fosters enter.
puppy-program.vercel.app/staff/dashboard
Dashboard
🔔 View All Alerts
+ Add Puppy
🔔 Needs attention today — ranked by urgency
Zeb · No log in 3+ days
Medium
Zora · No log in 3+ days
Medium
Zuri · Persistent jumping pattern
Medium
Puppies
| Name | Age | Foster | Alerts |
| Zuri | 31 wks | Luke Dang | 1 |
| Zeb | 75 wks | — | 0 |
| Zora | 31 wks | Zora Foster | 0 |
Support Queue
High: Zuri ate grass — 5d open
!
Needs attention today — auto-populated from alert engine. Staff open their day here, not from email.
1
4 stat tiles — Active Puppies, Open Alerts, High Severity, Active Fosters. All live from database.
2
Puppies table — alert count per puppy highlighted in amber/red. Zuri's "1" indicates an unresolved alert. Click row to open puppy profile.
!
Support Queue preview — highest priority open ticket shown inline. Red border = High/Emergency. Staff can act without leaving dashboard.
3
Support badge on sidebar — live count of unread tickets. Persists across all pages so staff never miss incoming requests.
Staff Alerts — automated engine output
puppy-program.vercel.app/staff/alerts
Alerts
Open
All severity ▾
All types ▾
All dates ▾
⚠ Persistent jumping reported — 3 of last 5 days
Zuri · Foster: Luke Dang · 4d open
Jumping logged on 3 of last 5 days. Pattern indicates behaviour reinforcement.
• Review OFF cue with foster (CM-029)
• Management: prevent greeting strangers until resolved
• Consider coordinator visit if unresolved in 7 days
medium
1
Auto-generated alert — created by a Postgres trigger, not by any staff action. Zero manual work to detect this pattern.
2
Recommended actions — seeded into each alert type. Staff get a protocol checklist, not just a flag.
3
Inline status + notes — staff update status (Open → In Review → Resolved) and add notes without leaving the screen. Append-only audit log records all actions.
4
Filters — by status, severity, type, and date range. Designed for a coordinator managing multiple puppies across multiple fosters.
puppy-program.vercel.app/staff/support
Support Queue
New (3)
In Progress (0)
Resolved (1)
High + Emergency
Zuri · High · Ate something unsafe · item ingested: grass
highNew
Zuri
Luke Dang
Ate something unsafe
5d open
Zuri ate grass about 20 minutes ago. No vomiting yet, but seems sleepy.
Reply
Mark resolved
Escalate
!
High-priority ticket (red border) — visual triage at a glance. Staff know which ticket to handle first without reading every line.
1
4 queue counters — Emergency, High, Awaiting, Resolved. Coordinators open their day knowing exactly what state the queue is in.
2
Structured ticket format — puppy, foster, category, timestamp, and SLA badge (5d open) in every ticket. No freeform email parsing.
3
Inline actions — Reply, Mark resolved, Escalate. No modal. Staff stay in context.
🐕
Puppy profiles
Each puppy has a full profile: DOB, breed, sex, Foundation ID, foster assignment, placement date. Operational snapshot shows last log date, open alerts, and open support tickets in one view.
👨👩👧
Foster directory
All active and inactive fosters with contact info, assigned puppies, and status. Staff can navigate directly from foster to their assigned puppy profile.
📚
Content management
46 modules managed by staff. Unlock logic is rule-based: by placement days, puppy age, and sex. Staff can add new modules without a developer.
⊞
Action queues
Dashboard surfaces: unanswered tickets, stale open issues, and high-risk queue. Three distinct queues so coordinators know where to start every morning.
Engine
Automated Alert Rules
Alerts are generated by Postgres triggers — not by app logic, not by staff reviewing logs manually. Every time a daily log is saved, four rules evaluate in sequence. If a rule fires, an alert is created or escalated automatically.
📋
Foster saves log
Daily log upserted
→
⚡
Postgres trigger fires
AFTER INSERT/UPDATE
→
🔍
fn_evaluate_all_rules
4 rules checked
→
🔔
Alert created/escalated
Deduplicated per puppy
→
👁
Staff notified
Dashboard + badge
| Rule |
Condition |
Initial severity |
Escalation |
Who sees it |
A — Missing socialization Weeks 8–20 of age |
No socialization logged for 8+ consecutive days |
Medium |
Escalates to High at 14 days |
Staff + Foster |
B — Jumping pattern Any age |
behavior_jumping = true on 3 of last 5 log days |
Medium |
No auto-escalation |
Staff + Foster |
C — Potty regression Age >18 weeks |
2+ accidents/day for 3 consecutive days |
Medium |
No auto-escalation |
Staff only |
D — Health flag Any age |
Vomiting or diarrhea on 2 consecutive log days |
High |
Immediate high |
Staff + Foster |
Alert deduplication: A partial unique index on the alerts table ensures only one open alert per puppy per rule type can exist at a time. If the same condition persists, the existing alert is updated — not duplicated. Staff always see one clean alert per issue.
Security
Security & Data Integrity
Show detailsHide details⌄
What you can't see in the UI is as important as what you can. Every data access decision is enforced at the database level — not just in the application code.
Row-Level Security: each org sees only its own data
🔒 Zuri (Puppy)
🔒 Zeb (Puppy)
🔒 Luke Dang (Foster)
🔒 Staff Coordinator (Staff)
🔒 Alert engine data
RLS WALL — Postgres enforced
Org B (future)
🔒 Their puppies
🔒 Their fosters
🔒 Their logs
🔒 Their alerts
Cannot see Partner Org data — ever
| Control |
Layer |
Detail |
Status |
| Row-Level Security (RLS) Supabase Postgres |
Database |
All 18 tables have RLS enabled. Users can only access rows where org_id matches their organization. No application-level bypass possible. |
✓ |
| Auth — magic link only Supabase Auth |
Auth |
No passwords stored. Sign-in is email OTP via Supabase. No password reset flows, no credential leaks. |
✓ |
| Role-based routing App layer |
App |
Foster users cannot access /staff/* routes. Staff users cannot access /foster/* routes. Role stored in profiles table, verified on every route. |
✓ |
| org_id on every table Database schema |
Database |
Every table from puppies to daily_logs to alerts carries org_id. Multi-tenancy is structural, not optional. |
✓ |
| Alert engine in Postgres only Postgres triggers |
Database |
No alert logic in app layer. Triggers cannot be bypassed by a UI bug or a malformed API call. |
✓ |
| Unique constraint on daily logs Database |
Database |
UNIQUE(puppy_id, log_date) with ON CONFLICT DO UPDATE. Duplicate logs are impossible. Fosters can re-save the same day safely. |
✓ |
| Append-only alert event log alert_events table |
Database |
Every status change on an alert is recorded in alert_events. Full audit trail. Cannot be deleted from the app. |
✓ |
| No passwords, no PII beyond name/email Data minimization |
Policy |
No medical records, no SIN, no financial data. The only personal data collected is name, email, phone (optional). PIPEDA compliant scope. |
✓ |
| React Query cache scoped by orgId App layer |
App |
Client-side query cache keys include orgId. Prevents cross-org data bleed if two staff users share a browser session. Cache cleared on sign-out. |
✓ |
| Security expert review Planned |
External |
Full penetration test and RLS policy audit planned after pilot contract is signed. Not a pre-launch blocker for internal pilot. |
→ |
Pilot note: The platform is currently in a controlled internal pilot with known test accounts. The external security review is scoped for post-contract. All data accessed during the pilot is test data only.
Backend
Database Architecture
Show detailsHide details⌄
18 tables, all deployed in Supabase Postgres with RLS enabled. The schema is designed for multi-tenancy from day one — a second organization (e.g. a different guide dog program) can be onboarded without any schema changes.
| Table | Purpose | Key constraints |
organizations | Org scoping. Partner org row seeded. | All other tables reference org_id here |
profiles | id = auth.users.id. Roles: foster / staff / vet / org_admin | SECURITY DEFINER functions prevent RLS recursion |
puppies | DOB drives all age calculations. Never store computed age. | Age always calculated from DOB string at query time |
daily_logs | 6 sections. Core data source for alert engine. | UNIQUE(puppy_id, log_date) — ON CONFLICT DO UPDATE |
alerts | Auto-created by Postgres triggers only. | Partial unique index: one open alert per puppy+type |
alert_events | Append-only audit trail for every alert status change. | INSERT only — no UPDATE or DELETE from app layer |
content_modules | 46 rows seeded. Unlock logic: stage + day_after_placement + age_days | CM-012 (heat cycle): female puppies only |
support_tickets | Foster-submitted structured requests. | Priority: low / medium / high / emergency |
foster_stats | Denormalized streak + points counters. | Updated by server trigger — never client-side |
foster_achievements | Earned badges per foster. | 8 badge definitions seeded |
Roadmap
How the Pilot Can Work
A structured approach to move from prototype preview to real operational impact.
1
Prototype Preview
Review the system and explore the interactive prototype.
2
Guided Demo
Walk through the system with staff and active foster participants.
3
Pilot Program (1–2 months)
Test the system in real workflows and gather feedback.
4
Post-Pilot Plan
Receive a structured roadmap, priorities, and cost outline.
5
Implementation
Move into phased development and longer-term rollout.
6
Future Opportunities
Explore partnerships, donations, and extended features.