The minimalist way to find a time to jam.
A lightweight, real-time availability scheduler built for musicians, teams, and friends who want to find common free time without the friction of complex calendar apps.
- No Sign-Ups: Share a link, start collaborating instantly
- Lightning Fast: Minimal UI, maximum speed
- Mobile Native: Built for thumb-friendly interactions
- Real-Time Sync: See everyone's availability update live
- Visual Heatmap: Green shading shows group availability at a glance
- Privacy Focused: No tracking, no databases storing personal data beyond the event
- Create an Event: Pick your time range (up to 7 days) and event name
- Mark Your Time: Click & drag across time slots to mark when you're available
- Share the Link: One-click copy to clipboard—no registration needed
- See Results: Watch in real-time as others mark their availability
- Find the Sweet Spot: Green-shaded cells show when the group is most available
| Layer | Technology |
|---|---|
| Frontend | Next.js 14 (App Router) + React 18 |
| Styling | Tailwind CSS |
| Database | Supabase (PostgreSQL) |
| Real-Time | Supabase Realtime |
| Deployment | Vercel |
- Node.js 18+
- npm or yarn
- Supabase account (free tier works great)
-
Clone the repo
git clone https://github.com/kapilcdave/when2jam.git cd when2jam -
Install dependencies
npm install
-
Set up environment variables Create a
.env.localfile in the project root:NEXT_PUBLIC_SUPABASE_URL=your_supabase_url NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
-
Run the development server
npm run dev
Open http://localhost:3000 in your browser.
npm run build
npm startOr deploy directly to Vercel:
npm install -g vercel
vercelwhen2jam/
├── app/
│ ├── page.tsx # Main scheduling UI
│ ├── layout.tsx # Root layout
│ └── globals.css # Global styles
├── lib/
│ └── supabase.ts # Supabase client
├── public/ # Static assets
├── package.json
├── tsconfig.json
└── tailwind.config.ts
- Minimalist: Remove friction, keep focus on finding time
- Accessible: High contrast, keyboard & touch friendly
- Fast: Instant interactions, no loading spinners where possible
- Mobile-First: 30-minute time slots are tap-friendly
Found a bug or have an idea? Contributions are welcome!
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is open source and available under the MIT License.
👨💻 Made with ♥ by Kapil
Have feedback or questions? Open an issue or reach out on Twitter.