A festive web application for organizing Secret Santa gift exchanges with your family or friends.
| Login | My Match |
|---|---|
![]() |
![]() |
| My Wishlist | Gift Ideas |
|---|---|
![]() |
![]() |
| Admin Panel |
|---|
![]() |
- Fully Mobile Friendly - Works great on phones, tablets, and desktops
- Secret Match Reveal - Animated first-time reveal of your Secret Santa recipient
- Wishlist Management - Add Amazon product URLs with automatic title/price/image scraping
- Recipient Wishlist - View your recipient's wishlist to find the perfect gift
- Email Notifications - Participants get notified when matches are made and wishlists updated
- Admin Panel - Manage users, generate random match assignments, reset passwords
Let an AI assistant install Secret Santa for you! Works with:
- Claude Code - Anthropic's coding assistant
- Gemini CLI - Google's AI terminal
- OpenAI Codex - OpenAI's coding AI
Just open your AI assistant in this project folder and say:
Help me install Secret Santa @AGENTS.md
The AI will:
- Ask which installation method you prefer (local Docker or cloud)
- Check if you have the required software
- Set up your configuration file
- Create your admin account
- Get everything running!
Deploy instantly to a cloud provider:
After deploying, you'll need to set your environment variables (see Email Setup below).
Host Secret Santa on your own computer or server. Perfect for keeping your family's data private!
- A computer (Windows, Mac, or Linux)
- Docker Desktop (free) - Install Guide
- A Gmail account (for email notifications)
- About 10 minutes
Docker runs the app in a container, so you don't need to install anything else.
| Operating System | Download Link |
|---|---|
| Windows | Docker Desktop for Windows |
| Mac | Docker Desktop for Mac |
| Linux | Docker Engine for Linux |
After installing:
- Open Docker Desktop
- Wait for it to start (you'll see "Docker Desktop is running" in the system tray/menu bar)
Option A: Using Git (if you have it installed)
git clone https://github.com/YOUR_USERNAME/secret-santa.git
cd secret-santaOption B: Download ZIP
- Click the green "Code" button at the top of this page
- Click "Download ZIP"
- Extract the ZIP to a folder (e.g.,
C:\secret-santaor~/secret-santa) - Open a terminal/command prompt in that folder
Email notifications let participants know when matches are assigned and when wishlists are updated. The app works without email, but participants won't receive notifications.
Why an App Password? Google requires special passwords for apps to keep your account secure. This is a one-time setup.
-
Go to your Google Account Security page
-
Enable 2-Step Verification (if not already enabled)
- Under "How you sign in to Google", click 2-Step Verification
- Follow the prompts to enable it
-
Create an App Password
- Go to: https://myaccount.google.com/apppasswords
- You may need to sign in again
- Under "Select app", choose Mail
- Under "Select device", choose Other (Custom name)
- Type:
Secret Santa - Click Generate
-
Copy the password
- You'll see a 16-character password like:
abcd efgh ijkl mnop - Copy this password (you can remove the spaces)
- You'll see a 16-character password like:
-
Save it in your config file (next step)
-
Copy the example config file:
Mac/Linux:
cp server/.env.example server/.env
Windows (Command Prompt):
copy server\.env.example server\.env -
Edit the config file (
server/.env):Open in any text editor (Notepad, TextEdit, VS Code, etc.) and update these values:
NODE_ENV=production PORT=3001 CLIENT_URL=http://localhost:3001 # Your Gmail credentials (from Step 3) EMAIL_USER=your-gmail@gmail.com EMAIL_PASS=abcdefghijklmnop
Note: Remove any spaces from the App Password
Run this single command:
docker-compose up -dWait about 30 seconds for everything to start, then open your browser to:
Tip: To check if it's running:
docker-compose logs -fPressCtrl+Cto stop viewing logs (the app keeps running)
The first user needs to be created via command line:
docker exec -it secret-santa bun scripts/create-admin.tsYou'll be prompted to enter:
- Email address
- Display name
- Password
This account can manage users and generate Secret Santa matches!
- Log in with your admin account
- Go to the Admin tab
- Click Add User for each family member
- Share their login credentials (they'll receive a welcome email if you set up email)
When everyone is added:
- Go to the Admin tab
- Click Generate Matches
- Everyone gets assigned a random Secret Santa!
Want family members to access the app from their own homes? Here are three options:
Free, secure, and doesn't expose your home IP address.
-
Create a Cloudflare account at https://cloudflare.com
-
Install cloudflared:
- Mac:
brew install cloudflare/cloudflare/cloudflared - Windows: Download installer
- Linux:
curl -L https://pkg.cloudflare.com/cloudflared-stable-linux-amd64.deb -o cloudflared.deb && sudo dpkg -i cloudflared.deb
- Mac:
-
Login to Cloudflare:
cloudflared tunnel login
-
Create a tunnel:
cloudflared tunnel create secret-santa
-
Run the tunnel:
cloudflared tunnel --url http://localhost:3001
You'll get a URL like
https://random-words.trycloudflare.com- share this with family!
Tip: For a permanent custom domain, follow Cloudflare's full tunnel guide.
Every family member installs Tailscale, creating a private network.
- Install Tailscale on your computer: https://tailscale.com/download
- Create an account and connect your device
- Note your Tailscale IP (looks like
100.x.x.x) - Have family install Tailscale on their devices
- Share the URL:
http://100.x.x.x:3001
Everyone needs Tailscale installed, but it's very secure and easy.
Opens a port on your router. Less secure, but works without extra software.
-
Find your local IP:
- Mac/Linux:
ifconfig | grep "inet " - Windows:
ipconfig - Look for something like
192.168.1.x
- Mac/Linux:
-
Log into your router (usually http://192.168.1.1)
-
Set up port forwarding:
- External port:
3001 - Internal IP: Your computer's IP (e.g.,
192.168.1.100) - Internal port:
3001
- External port:
-
Find your public IP: https://whatismyip.com
-
Update your config (
server/.env):CLIENT_URL=http://YOUR_PUBLIC_IP:3001
-
Share the URL:
http://YOUR_PUBLIC_IP:3001
Warning: Your public IP may change. Consider using a dynamic DNS service like DuckDNS or No-IP.
docker-compose logs -fdocker-compose downdocker-compose restartgit pull
docker-compose down
docker-compose build --no-cache
docker-compose up -dMake sure Docker Desktop is open and shows "Docker Desktop is running" in the system tray.
- Check if the container is running:
docker ps - Check the logs for errors:
docker-compose logs - Make sure port 3001 isn't used by another app
- Double-check your Gmail App Password (no spaces)
- Make sure 2-Step Verification is enabled on your Google account
- Check the logs:
docker-compose logs | grep -i email
Make sure the container is running:
docker-compose up -d
docker exec -it secret-santa bun scripts/create-admin.tsRun Docker commands with sudo, or add your user to the docker group:
sudo usermod -aG docker $USERThen log out and back in.
Click to expand development setup
Frontend: React 19, TypeScript, Vite 6, Tailwind CSS 4, Framer Motion, shadcn/ui
Backend: Express, TypeScript, SQLite (better-sqlite3), bcrypt, cheerio
Prerequisites: Node.js 20+, Bun (for client)
Server:
cd server
npm install
npm run dev # Runs on port 3001Client:
cd client
bun install
bun run dev # Runs on port 5173secret-santa/
├── client/ # React frontend
│ ├── src/
│ │ ├── components/ # UI components
│ │ ├── pages/ # Page components
│ │ ├── hooks/ # Custom React hooks
│ │ └── lib/ # Utilities
├── server/ # Express backend
│ ├── routes/ # API endpoints
│ ├── middleware/ # Auth middleware
│ ├── db/ # Database schema
│ └── services/ # Email service
└── docker-compose.yml
- Email: admin@test.com
- Password: password123
MIT




