Schedule meetings, drop μpoints, track meeting attendance, and push purchase orders
- Meetings Admins and leads can spin up, edit, or delete meetings with descriptions, time blocks, and locations. Everyone sees the RSVP list, and reminders are sent to opted users via push notifications on multiple devices.
- Real attendance from BLE beacons. The time tracking tab can scan iBeacons over Web Bluetooth, spin up sessions, and roll them into clean hour totals per member without requiring sign ins.
- μpoints + leaderboard hype. Award μpoints manually or by completing bounties, track full award history, and surface a live leaderboard with attendance stats mixed in. Push notifications fire when someone earns points or sneaks into the top three (assuming they opted in).
- Bounties for ad-hoc tasks. Leads/admins can post quests with point values and mark them complete with notes so the right member gets the credit.
- Purchasing pipeline. Track requests, vendors, approvals, and purchase orders in one view so nothing falls through.
- Frontend: React + Vite, Tailwind, lucide icons, Sonner toasts, and a glassmorphic UI layer.
- Backend: Convex handles the database, auth, cron-style scheduling, and server-side logic.
- Push: Web Push via
public/sw.json the client andweb-pushinside Convex actions. - Hardware tie-ins: Web Bluetooth scanning for the attendance flow, with guard rails for browsers that can't scan.
- Install deps:
npm install
- Wire up env vars:
- Frontend (
.envor shell):VITE_VAPID_PUBLIC_KEY=your_public_vapid_key
- Convex deployment env:
VAPID_PUBLIC_KEY=your_public_vapid_key VAPID_PRIVATE_KEY=your_private_vapid_key VAPID_CONTACT=mailto:you@example.com CONVEX_SITE_URL=https://your.dev.domain
- Need keys? Run
npx web-push generate-vapid-keysonce and paste them in both places.
- Frontend (
- Kick off both servers:
Vite serves the React app,
npm run dev
convex devboots the backend, and the first account you create becomes the admin.
npm run build— production Vite build.npm run lint— type-check both Convex + frontend, boot a one-off Convex backend (for schema validation), then build the client. Bring a coffee; it does a lot.
src/— the React app.components/— dashboard panels, onboarding flow, purchase UI, leaderboard tabs, and the BLE time-tracking screen.lib/— helpers for members, formatting, and shared UI logic.
convex/— database schema plus all server-side queries/mutations/actions.meetings.tsschedules, RSVPs, and reminder jobs.members.tshandles onboarding, μpoint math, leaderboard queries, and push preferences.attendance.tsstores BLE check-ins and aggregates durations.bounties.tstracks quests that auto-award μpoints.notifications.tscentralizes push sending.lib/meetingTime.tsmakes the reminder scheduler timezone-aware.
public/sw.js— service worker that actually listens for pushes.
admin— can manage roles, scrub members, handle meetings, award μpoints, and oversee purchases/bounties.lead— manages meetings, awards μpoints, and runs bounties.member— RSVP, view the directory + leaderboard, submit purchase requests, and opt into pushes.
- Onboarding is a hard gate: no dashboard until the profile is filled out.
- Each device's push subscription is stored separately so phones and laptops can ping in sync.
- Meeting reminders reschedule themselves if they somehow fire early.
- Attendance durations use the earliest start + latest end per meeting/member so brief BLE dropouts don't nuke your hours.
- Leaderboard math blends μpoints, attendance totals, and award counts so you get a quick read on involvement.