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 wks0
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