preprounds

PrepRounds

A practice ground for the hard conversations charge nurses have to have.


The Problem

Charge nurses are promoted on clinical skill, then immediately expected to handle high-stakes people conversations they’ve never been trained for — delivering performance feedback, pushing back on unsafe staffing decisions, setting boundaries with physicians, de-escalating mid-shift conflict. These conversations directly affect patient safety, team retention, and unit culture, yet most charge nurses report feeling unprepared and anxious about them. Existing training options are infrequent, generic, and lack the realistic practice that builds genuine confidence.

What It Does

  1. Pick a scenario — four real clinical conversations, each with a named AI persona:
    • Feedback After a Near-Miss — give feedback on a documentation error without shame (Jordan, RN)
    • Saying No to Unsafe Overtime — push back on a mandatory-overtime request (Pat, House Supervisor)
    • Setting a Boundary — address a physician bypassing your assignment decisions (Dr. Reyes)
    • De-escalating a Shift Conflict — calm a heated mid-shift disagreement (Casey, RN)
  2. Roleplay against the AI persona — multi-turn text conversation; the persona responds dynamically based on your actual approach, not canned scripts
  3. Get structured feedback — a separate AI coach evaluates your transcript: what landed, what to try instead, and a 1–5 confidence score
  4. Track confidence over time — session history with a sparkline trend across your last sessions

Free users get 3 sessions. After that: subscribe for unlimited access, or watch a rewarded ad for one bonus session.

Award Categories

Category What to look at
Next Gen Award This entire repo — built by a student from a locked spec with an explicit anti-hallucination protocol, plus the six spec documents below
HAMM (freemium → subscription) lib/revenuecat.ts — FREE_SESSION_LIMIT, entitlement checks, Paywalls v2 presentation; app/paywall.tsx
Catvertising (rewarded ads) components/RewardedAdModal.tsx — user-initiated rewarded video; grantBonusSession() for the unlock logic
OneSignal lib/onesignal.ts — SDK init, permission flow, schedule management; app/(tabs)/settings.tsx — notification time picker

Engineering Discipline

This project was built against a locked specification with an explicit anti-hallucination protocol — a structured set of rules ensuring that every implementation decision traces back to one of six spec documents, and contradictions are flagged as spec bugs rather than resolved by assumption. No package names are guessed, no screen content is invented, no prompt wording is paraphrased.

Two examples from the real build, not hypotheticals:

The spec documents — the single source of truth for every screen, prompt, schema, and design token:

File What it covers
00-START-HERE.md Master index, bootstrap commands, source-of-truth rules
01-PRD.md Product requirements, personas, 8 user stories with acceptance criteria
02-ARCHITECTURE-AND-DATA.md Tech stack, folder structure, DB schema with RLS, API contracts
03-DESIGN-SYSTEM-AND-SCREENS.md Design tokens, component library setup, per-screen 3-state specs
04-SCENARIO-PROMPTS.md Verbatim roleplay persona prompts and feedback engine prompt
AGENTS.md Build order, definition of done, anti-hallucination protocol

Tech Stack

Layer Technology
Client React Native + Expo SDK 57, TypeScript (strict), Expo Router, gluestack-ui v3 + NativeWind
Server state TanStack Query v5
Chat UI react-native-gifted-chat
Backend Supabase — PostgreSQL, Auth (anonymous sign-in), RLS on all tables
LLM proxy Supabase Edge Function (Deno) → Google Gemini (structured JSON output)
Subscriptions RevenueCat (react-native-purchases + Paywalls v2)
Rewarded ads Google AdMob (react-native-google-mobile-ads)
Push notifications OneSignal (react-native-onesignal)

Architecture

┌─────────────────────────────────────────────────────┐
│              EXPO / REACT NATIVE CLIENT             │
│                                                     │
│  Expo Router screens → gluestack-ui components      │
│  lib/ wrappers for all external calls               │
└──────────┬──────────────────┬───────────┬───────────┘
           │                  │           │
    ┌──────▼──────┐   ┌──────▼─────┐  ┌──▼──────────┐
    │  Supabase   │   │ RevenueCat │  │  OneSignal   │
    │  Auth + DB  │   │ SDK        │  │  SDK         │
    │  + RLS      │   │ (subs,     │  │  (daily      │
    │             │   │  paywalls,  │  │   push)      │
    │  Edge Fn    │   │  ads)      │  │              │
    │  (LLM proxy)│   └────────────┘  └──────────────┘
    └──────┬──────┘
           │
    ┌──────▼──────┐
    │   Google    │
    │   Gemini    │
    │  (roleplay  │
    │  + feedback) │
    └─────────────┘

No custom backend server. The Edge Function’s only job is proxying LLM calls so the API key never ships in the client bundle. RevenueCat and OneSignal are called directly from the client via their official SDKs — that’s the intended integration pattern for both, not a shortcut.

Run It Locally

Prerequisites: Node.js 18+, Xcode (required by native AdMob and OneSignal SDKs).

cd preprounds
npm install

# Copy env template and fill in your own service keys
cp .env.local.example .env.local

# Set the LLM key as a Supabase Edge Function secret (never client-side)
npx supabase secrets set LLM_API_KEY=<your-gemini-key>

# Generate native project and run
npx expo prebuild
npx expo run:ios

A note for judges: Running a live instance requires your own Supabase project, Gemini API key, RevenueCat app, OneSignal app, and AdMob account. Without those, you can still review all source code and watch the demo video above. The codebase is fully readable without running it — there is no generated or obfuscated code.

What This Is Not

PrepRounds is a communication-practice tool, not medical, legal, or HR advice. All scenarios use fictional personas in hypothetical situations. This mirrors the in-app disclaimer presented to every user.

License

MIT