Anonymous Santa Clauses
Draw names for Secret Santa with friends, family or the office. Free, no ads, no passwords: sign in with a magic link, share a code, roll the dice.
Track and rate your coffee shop visits on the road.
LifestyleJavaScript · CSSGitHub @erikroleOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Tracking AJ's road coffee orders
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗A beautiful web app for tracking coffee shop visits during basketball road trips. Rate the vibe, rate the coffee, and keep track of all your caffeinated adventures!
🚀 Live at: coffee.erikrole.com
Deploying to Cloudflare? See DEPLOYMENT.md for complete instructions on deploying to Cloudflare Pages with D1 database.
git clone <your-repo-url>
cd vibes-and-grinds
cd backend
npm install
cp .env.example .env
# Edit .env if needed (default port is 3001)
npm start
The backend will:
http://localhost:3001vibes-and-grinds.db)cd frontend
npm install
cp .env.example .env
Important: Edit frontend/.env and add your Google Maps API key:
VITE_API_URL=http://localhost:3001
Then in the project root .env (for the backend), add:
GOOGLE_MAPS_API_KEY=your_actual_api_key_here
NET_RANKINGS_URL=https://big-ten-standings.erikrole.workers.dev # optional override
If you want the frontend to call your worker directly instead of the API proxy, you can also set:
VITE_NET_RANKINGS_URL=https://big-ten-standings.erikrole.workers.dev # optional direct browser override
The vest tracker accepts either a dedicated NET rankings payload, your Big Ten standings worker shape ({ standings: [{ team, netRank, ... }] }), or a full D1 map shape ({ netRankings: { "DUKE": 1, ... } }). If no env var is set on the API, it defaults to https://www.warrennolan.com/basketball/2026/net and parses all teams from HTML.
Vest games now sync via /api/vest/games backed by DB storage (instead of device-only localStorage), so updates on one device can appear on another once both are online.
If using Cloudflare D1, re-run migrations/schema apply so vest_games exists.
Visits also carry a visit_type column (road or home) so Madison stops can be tracked separately from road trips. Existing D1 databases need a one-time column add — see Madison Coffee Shops.
Then start the development server:
npm run dev
The frontend will open at http://localhost:3000
Everyday stops around Madison live in the same journal as road trips, tagged visit_type = 'home':
Madison, WI.{season} review link all cover road trips only — a season is a road season. Everywhere else (visit list, hero totals, search, map, insights, badges) counts every visit, Madison included.Existing databases need the column added once. Locally this happens automatically on server start; for D1:
wrangler d1 execute vibes-and-grinds-db --remote \
--command "ALTER TABLE coffee_visits ADD COLUMN visit_type TEXT DEFAULT 'road'"
SQLite backfills existing rows with 'road', so past visits stay road trips.
GET /api/visits - Get all visitsGET /api/visits/:id - Get a single visitPOST /api/visits - Create a new visitPUT /api/visits/:id - Update a visitDELETE /api/visits/:id - Delete a visitGET /api/stats - Get dashboard statisticsvibes-and-grinds/
├── backend/
│ ├── server.js # Express server
│ ├── database.js # Database initialization
│ ├── package.json
│ └── .env.example
├── frontend/
│ ├── src/
│ │ ├── components/ # React components
│ │ ├── utils/ # Helper functions
│ │ ├── App.jsx # Main app component
│ │ ├── main.jsx # Entry point
│ │ └── index.css # Tailwind styles
│ ├── index.html
│ ├── package.json
│ └── .env.example
└── README.md
See also PRODUCT_PLAN.md for v1/v2 scope and roadmap.
npm run dev # Start with nodemon (auto-reload)
npm start # Start production server
npm run dev # Start development server
npm run build # Build for production
npm run preview # Preview production build
GOOGLE_MAPS_API_KEY (and optionally VITE_GOOGLE_MAPS_API_KEY for legacy frontend usage)cd frontend && npm install && npm run buildfrontend/distbackend folderPORT (provided by platform)Autocomplete not working?
GOOGLE_MAPS_API_KEY is set in the backend/root .env (or in Cloudflare Pages env vars).Backend not connecting?
VITE_API_URL in frontend .env matches backend URLDatabase issues?
backend/vibes-and-grinds.db and restart the server to resetFeel free to open issues or submit pull requests!
MIT