Ditch the group chat chaos. A self-hosted, simplified scheduling tool for tabletop gamers.
TabletopTime helps you find the best time for your gaming group to meet. It is designed to be self-hosted on your home server (Synology, Unraid, Rasp Pi) and integrates deeply with Telegram for real-time coordination.
- Host: Create, edit, and delete time slots dynamically. Manage quorum rules (min players) and capacity limits (max players). Remove accepted participants to trigger waitlist auto-promotion.
- Vote & Suggest: No login required. Simple "Yes", "If Needed", or "No" voting. Attendees can also suggest new time slots if none work.
- Waitlist: Automatic waitlist management with First-Come-First-Serve promotion when spots open up.
- Finalize: Select a host/location and generate calendar invites (.ics / Google Calendar). Once finalized, slot management is locked.
- Telegram / Discord Bot:
- Pins a live-updating dashboard in your group chat.
- Notifies everyone when an event is finalized.
- Discord Exclusive:
- "Recover with Discord" allows instant login for event managers.
- Post live-updating dashboards to your channel.
- My Events & Cross-Device Sync: No account, but connect Telegram or Discord and your voting history follows you anywhere. The profile page shows a per-event sync badge (linked, or "This Device Only"), and you can link or unlink any event you've voted on straight from that badge.
- Privacy & Security:
- Zero Tracking: We do not use Google Analytics, Facebook Pixels, or any third-party trackers.
- Secure Hashing: All administrative tokens are hashed (SHA-256) before storage. We never store plaintext keys.
- Self-Hostable: Your data stays on your server (SQLite). We capture as little information as possible.
- Persistence: We use cookies only to restore your session, never to track you.
Don't want to manage a server? We host a free version for the community.
The easiest way to run TabletopTime is using the pre-built Docker image.
docker run -d \
-p 3000:3000 \
-v ./data:/app/data \
-e DATABASE_URL="file:/app/data/scheduler.db" \
--name tabletop-time \
ghcr.io/mels0n/tabletop_scheduler:latestOpen http://localhost:3000 to start creating events.
TabletopTime is configured via environment variables. See EnvVariables.md for a complete list.
| Variable | Required | Description | Default / Example |
|---|---|---|---|
DATABASE_URL |
Yes | Path to SQLite DB. Must match volume mount. | file:/app/data/scheduler.db |
TELEGRAM_BOT_TOKEN |
Optional | Token from @BotFather for notifications. | 123456:ABC... |
TZ |
Optional | Timezone for logs/database. | America/Chicago |
- Telegram Setup Guide: How to create a Telegram bot.
- Discord Setup Guide: How to create a Discord bot and enable OAuth.
- Understanding Magic Links: How passwordless recovery and login works.
- Environment Variables: Detailed configuration options.
- Privacy & Architecture: How we ensure self-hosted privacy (NoOp builds).
- API Reference: Internal API endpoints and webhook specs.
- User Guide: Comprehensive usage guide.
- Contributing: Guide for developers wanting to help out.
- Reverse Proxy Example: Nginx configuration for exposing to the web.
To build from source:
- Clone the repo:
git clone https://github.com/mels0n/tabletop_scheduler.git - Install dependencies:
npm install - Initialize DB:
npx prisma migrate dev - Start server:
npm run dev
See CONTRIBUTING.md for more comprehensive dev instructions.
CC-BY-NC-SA 4.0