FlowMinder
Overview
FlowMinder is a full-stack Zoom app built to keep meetings structured, visible, and on schedule. It acts like a shared agenda and timing layer for Zoom meetings: hosts can plan topics ahead of time, manage timers during the meeting, and publish updates in real time, while participants can follow the meeting flow without relying only on one host’s screen share or verbal updates.
The product came out of a real meeting problem: discussion flow is often unclear, time is easy to lose track of, and participants do not always have a shared view of what is happening. That direction was later validated when Zoom introduced its own agenda and timer features in the same space.
The app combines a Next.js + TypeScript frontend, an Express.js backend, Socket.IO for real-time sync, and Supabase PostgreSQL for persistence, along with the Zoom App SDK and Zoom OAuth + REST APIs for meeting context, authentication, and meeting-linked workflows.
Core Features
- Dual entry experience: Supports both browser-based planning and in-meeting use through the Zoom app sidebar.
- Real-time agenda sync: Broadcasts agenda progression, timer updates, and meeting flow changes live to connected participants.
- Host-controlled publishing: Lets hosts stage agenda edits locally and only reveal finalized updates after saving.
- Late-joiner clarity: Keeps the active agenda item visible so participants can quickly understand the current topic.
- Anonymous nudges: Allows participants to send lightweight feedback like “speak up” or “speak less” without disrupting the meeting.
Architecture
FlowMinder uses a three-part architecture:
- Frontend (Next.js / React / TypeScript / Tailwind / Zustand): Renders host and participant views, manages local UI state, and handles meeting setup flows.
- Backend (Express + Socket.IO): Exposes REST APIs for meeting and agenda operations while synchronizing live meeting state across users.
- Database (Supabase PostgreSQL): Stores meetings, agenda items, nudges, linked Zoom users, and OAuth tokens using normalized relational tables.
A key design decision was loading the Zoom App SDK only on meeting-context routes, keeping lighter pages like login and scheduling free of unnecessary overhead.
Real-Time Sync Model
FlowMinder uses Socket.IO instead of polling so the server can push updates as soon as agenda state, timers, or nudges change. The backend acts as the source of truth, while the frontend uses optimistic updates to keep interactions responsive and roll back when a request fails.
To reduce race conditions during host actions, the app favors ordered async execution with async/await over looser concurrent mutation patterns.
Zoom Integration
Inside the meeting, the Zoom App SDK provides meeting identity, participant identity, and role context so the app can determine who the host is and what actions are allowed.
Outside the meeting, Zoom OAuth and Zoom REST APIs support authentication, meeting scheduling, and agenda preparation. This split keeps the in-meeting experience lightweight while still supporting pre-meeting planning in the browser.
Security & Engineering Lessons
OAuth tokens are stored in Supabase PostgreSQL and never exposed to the client. Role-based access controls ensure hosts can manage agendas and timers while participants are limited to viewing shared state and sending nudges.
The main engineering challenge was balancing real-time collaboration with host control. The staged-save workflow solved that by separating private host edits from the live participant view, keeping the shared state responsive without becoming chaotic.
Future Improvements
- Analytics: Track timer usage, agenda drift, and nudge activity over time.
- Speaker ownership: Assign agenda items to presenters.
- Time extension workflows: Let participants vote to continue discussion.
- Cross-platform support: Extend the model beyond Zoom.
- Socket scaling: Add Redis-backed socket coordination for larger meeting volume.
Repository
Repository: github.com/evanwlaw/flowminder-app