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.

Organization
Partner Organization
Pilot contact
Program Coordinators
Build
v0.1.2 · March 2026
Stack
React · Supabase · Vercel
👤 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.

46
Content modules seeded
18
Database tables with RLS
4
Automated alert rules
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
→
📋
Daily log
<90 sec
→
🔔
Alerts surface
Auto-generated
→
📚
Content unlocks
By age + placement
Foster Home Screen
Good morning, Luke 👋
Zuri · 31 weeks · GoldenLab · Female
🔥 4-day streak
⚠️
Jumping pattern flagged by staff
Review recommended actions →
medium
Today's log
+ Log now
No log submitted today
Milestones
✓ Sit
✓ Stay
○ Down — in progress
12
Logs submitted
85
Points earned
🏠
Home
📋
Log
📚
Content
🔔
Alerts
👤
Profile
!
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
🚽 Potty
Successes
−
3
+
Accidents
−
0
+
🍽 Feeding
2× meals
1× meal
Refused food
🐾 Behaviour
Jumping
Mouthing
Pulling
Barking
❤ Health
Healthy
Vomiting
Diarrhea
🌍 Socialization
New people
New environments
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.

Staff Dashboard
puppy-program.vercel.app/staff/dashboard
⊞ Dashboard
🐕 Puppies
👨‍👩‍👧 Fosters
🔔 Alerts 1
📚 Content
🎧 Support 3
⚙ Settings
PC
Staff Coordinator
Staff coordinator
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
3
Active Puppies
1
Open Alerts
0
High Severity
3
Active Fosters
Puppies
NameAgeFosterAlerts
Zuri31 wksLuke Dang1
Zeb75 wks—0
Zora31 wksZora Foster0
Support Queue
3
New
1
High
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
⊞ Dashboard
🐕 Puppies
👨‍👩‍👧 Fosters
🔔 Alerts 1
📚 Content
🎧 Support 3
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
Add
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.
Staff Support Queue
puppy-program.vercel.app/staff/support
⊞ Dashboard
🐕 Puppies
👨‍👩‍👧 Fosters
🔔 Alerts 1
📚 Content
🎧 Support 3
Support Queue
0
Emergency
1
High
3
Awaiting
1
Resolved
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.

How an alert is created
📋
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
Partner Org
🔒 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
🔐

Security checklist

Enforced at database level — not just front-end

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.

TablePurposeKey constraints
organizationsOrg scoping. Partner org row seeded.All other tables reference org_id here
profilesid = auth.users.id. Roles: foster / staff / vet / org_adminSECURITY DEFINER functions prevent RLS recursion
puppiesDOB drives all age calculations. Never store computed age.Age always calculated from DOB string at query time
daily_logs6 sections. Core data source for alert engine.UNIQUE(puppy_id, log_date) — ON CONFLICT DO UPDATE
alertsAuto-created by Postgres triggers only.Partial unique index: one open alert per puppy+type
alert_eventsAppend-only audit trail for every alert status change.INSERT only — no UPDATE or DELETE from app layer
content_modules46 rows seeded. Unlock logic: stage + day_after_placement + age_daysCM-012 (heat cycle): female puppies only
support_ticketsFoster-submitted structured requests.Priority: low / medium / high / emergency
foster_statsDenormalized streak + points counters.Updated by server trigger — never client-side
foster_achievementsEarned 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.

👉 Book a Guided Demo View Interactive Prototype
View Interactive Prototype