A shared-session meeting companion for the InnovateHer 2026 hackathon. One person is the Host/Listener who captures audio and generates live nudges; others join as Viewers to see the same idea board. After the meeting, a Shine Reflection Report highlights participation and recognition.
Feel free to checkout this project!
- Next.js App Router + TypeScript
- Tailwind CSS
- Supabase (optional—app runs without it)
-
Clone and install dependencies:
npm install
-
Run the dev server:
npm run dev
-
Open http://localhost:3000.
The app works without these. If missing, it runs in local mock mode (in-memory sessions).
| Variable | Description |
|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Your Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Supabase anonymous key |
STT_PROVIDER |
mock (default), deepgram (others can be added later) |
STT_API_KEY |
Deepgram API key (optional; mock used if missing) |
OPENAI_API_KEY |
Optional. For AI nudges and Shine Reflection Report. Uses mock if missing. Never expose to client. |
NEXT_PUBLIC_NUDGE_INTERVAL_SECONDS |
Optional. Seconds between auto-nudges (default: 60). |
Create .env.local in the project root (same folder as package.json):
NEXT_PUBLIC_SUPABASE_URL=https://your-project-id.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
- Use separate lines (no commas). No quotes unless a value has spaces.
- Restart the dev server after changing
.env.local.
- In Supabase dashboard: SQL Editor → New query
- Paste the contents of
supabase/schema.sqland run it (creates tables + RLS policies).
If you already ran the schema before RLS was added, run supabase/rls-policies.sql instead.
The schema defines:
- sessions – meeting sessions (code, status, host_name)
- events – realtime events within a session
- meetings – transcript + reflection report after a meeting
See supabase/schema.sql for the full DDL.
- Landing page (Create / Join session)
- Session page with live events feed: Voices to Revisit, Idea Board, Transcript Feed
- Supabase Realtime for events (when configured) or localStorage polling (mock)
- Host-only: Start/Stop Listening (mic capture), Type a note fallback, test buttons
- Session code generator (e.g.
SUNFLOWER-42) - Overlap-based interruption detection (Web Audio API, client-side) — detects possible interruptions via audio energy
- AI nudges (
POST /api/nudge) and Shine Reflection Report (POST /api/reflect) via OpenAI (mock whenOPENAI_API_KEYnot set) - Meetings storage and dashboard: list meetings and view full Shine Reflection Report (including Interruption Patterns)
No configuration needed. Transcription returns placeholder text for testing the pipeline.
- Get a Deepgram API key (free tier available).
- Add to
.env.local:STT_PROVIDER=deepgram STT_API_KEY=your-deepgram-api-key - Restart the dev server.
Audio format: Chrome’s MediaRecorder produces audio/webm (Opus), which Deepgram supports. Chrome recommended; webm supported. For other browsers, see Deepgram supported formats.
- Create a session as host.
- Click Start Listening and allow mic access.
- Speak clearly for a few seconds.
- Wait ~10 seconds for the first chunk; real speech should appear in the Transcript Feed.
- If you see mock placeholder text instead, check:
STT_PROVIDER=deepgramandSTT_API_KEYare set in.env.local- Server logs for
[transcribe] Deepgram error:messages
When the host clicks Start Listening, the browser will request microphone access. If you deny or block it:
- A friendly banner appears: "Mic access denied. Use Type a note below to add transcript manually."
- Use the Type a note input box to add transcript chunks manually.
To enable mic capture, allow the site in your browser (e.g. Chrome: click the lock/mic icon in the address bar → Site settings → Microphone → Allow). Use https or localhost; some browsers restrict getUserMedia on insecure origins.
- Create a session as host: go to
/, click Create Session. - Copy the session link (Copy link button) or note the session code.
- Open a second tab: paste the link or join with the code as a viewer.
- In the host tab: click "Add test transcript chunk" or "Add test nudge".
- In the viewer tab: new events should appear within ~1 second (mock) or instantly (Supabase Realtime).
Supabase Realtime setup: Run supabase/rls-policies.sql in Supabase SQL Editor to enable events RLS and Realtime. Without it, Supabase will still store events, but the viewer tab may not see them in real time until you refresh.
The host browser uses the Web Audio API (AudioContext, AnalyserNode) to detect possible interruptions based on audio energy overlap:
- RMS threshold: Default 0.03 (tune in
src/lib/overlap-detection.ts— lower = more sensitive, higher = fewer false positives) - Chrome recommended for best compatibility with both MediaRecorder and AudioContext
- If AudioContext fails or is unsupported, interruption detection is disabled gracefully; the session continues
- Create a session as host and click Start Listening.
- Speak into the mic; have a second person (or another tab playing audio) speak over you.
- When overlap is detected, a "Possible interruption detected" card appears with suggested phrases ("Sorry, go ahead", "I think someone was finishing a thought").
- Use Dismiss or Snooze to hide the card.
- Create a session as host; click Start Listening and speak (or use "Type a note").
- Wait for the nudge timer (~60s) or click Generate nudge now to add Voices to Revisit.
- Click End Meeting to generate a Shine Reflection Report (including interruption patterns) and navigate to the dashboard.
- On Dashboard (
/dashboard), click a meeting to view the full report.