Schedule gaming sessions with friends — web dashboard + Discord bot.
FreeToPlay is a self-hosted web app and Discord bot for adult gaming groups who struggle to line up schedules.
Log in with Discord, pick a game, set a time, and let friends RSVP from the web calendar or straight from Discord. When someone creates or cancels a session, the bot keeps your channel in sync automatically.
Ideal for Unraid, Docker, Portainer, or any home server — with optional HTTPS via Nginx Proxy Manager.
- Ultra-dark SaaS UI — slate/zinc theme, rounded cards, emerald accents
- Monthly calendar — sessions appear on the correct day with time + title
- Sidebar widgets — upcoming sessions and active members
- Event detail pages — cover art banner, description, host info
- RSVP statuses — Confirmed (teal), Tentative (amber), Declined (rose)
- Capacity tracking — max players + live progress bar (e.g. 3/4 filled)
- Host controls — creators can cancel/delete their own events
- Discord login — Passport OAuth2, no separate accounts
- IGDB API autocomplete — type a game name, pick from live results (powered by Twitch)
- Cover art — pulled automatically onto the dashboard and Discord embeds
- Works without an API key (manual game names still work)
- Rich embeds on new sessions (title, game, time, slots, host, cover art)
- Interactive buttons — Join / Tentative / Decline (syncs to the database)
- Web Dashboard button — opens your calendar so others can host too
- Clickable event title — links to that session’s web page
- Cancellation sync — deletes the original embed and posts a cancel notice
- Docker / GHCR image —
ghcr.io/mckenna654/freetoplay:latest - SQLite + Prisma — simple single-file DB on a volume
- Reverse proxy ready — trust proxy + secure cookies for HTTPS domains
- MIT licensed
Image: ghcr.io/mckenna654/freetoplay:latest
| Setting | Value |
|---|---|
| Network | Bridge |
| Port | 3000 → 3000 |
| Path | Host /mnt/user/appdata/freetoplay/data/ → Container /app/data |
| Variable | Required | Description |
|---|---|---|
DISCORD_CLIENT_ID |
Yes | Discord application client ID |
DISCORD_CLIENT_SECRET |
Yes | Discord application client secret |
DISCORD_BOT_TOKEN |
Yes | Bot token |
DISCORD_CHANNEL_ID |
Yes | Channel ID for session posts |
BASE_URL |
Yes | Public URL, e.g. https://f2p.example.com or http://192.168.1.50:3000 |
SESSION_SECRET |
Yes | Random string for login cookies |
DATABASE_URL |
Yes | Must be file:/app/data/prod.db |
IGDB_CLIENT_ID |
No | Twitch/IGDB Client ID for game search/art |
IGDB_CLIENT_SECRET |
No | Twitch/IGDB Client Secret |
PORT |
No | Defaults to 3000 |
- Create an app in the Discord Developer Portal.
- OAuth2 → Redirects: add
{BASE_URL}/auth/discord/callback
Example:https://f2p.example.com/auth/discord/callback - Create a Bot, copy the token, enable message/embed permissions.
- Invite the bot with the
botscope (Send Messages, Embed Links, View Channels). - Enable Developer Mode in Discord → right-click your channel → Copy Channel ID.
FreeToPlay uses Twitch's IGDB to power game search and cover art.
- Sign up at dev.twitch.tv and register an application.
- Generate a Client Secret.
- Set
IGDB_CLIENT_IDandIGDB_CLIENT_SECRETas environment variables on your container. - Restart the container. On Schedule Session, type 3+ letters in Game Name for autocomplete + cover art.
- Set
BASE_URLto your HTTPS domain, e.g.https://f2p.example.com. - Add the same domain callback in Discord OAuth2 redirects.
- In NPM, add a Proxy Host:
- Domain:
f2p.example.com - Forward to: your server IP, port
3000 - SSL: Let’s Encrypt + Force SSL
- Enable Websockets if available
- Domain:
git clone https://github.com/mckenna654/FreeToPlay.git
cd FreeToPlay
cp .env.example .env # fill in Discord + secrets
npm install
npx prisma migrate dev
npm run devOpen http://localhost:3000.
- Node.js + Express + EJS
- Prisma + SQLite
- discord.js
- Passport Discord OAuth
- Tailwind CSS
- Docker (multi-stage Alpine image)
See CHANGELOG.md for the full 1.x release history.
| Version | Highlights |
|---|---|
| 1.6.0 | Migrated game search and artwork integration to IGDB |
| 1.5.1 | Docker build fix + migration recovery guidance |
| 1.5.0 | Branding, MIT license, docs polish |
| 1.4.0 | Discord web links, reverse proxy / HTTPS support |
| 1.3.0 | Host cancel + Discord cancellation sync |
| 1.2.0 | Calendar UI, RSVP statuses, interactive Discord buttons |
| 1.1.0 | Game search + cover art |
| 1.0.0 | Initial web app, Discord bot, Docker |
Note: Always pull
ghcr.io/mckenna654/freetoplay:latestor:v1.5.1.
Do not pin old tags likev1.0.0–v1.4.0for production — those point at early snapshots.
MIT © mckenna654
