Anonymous Santa Clauses
친구·가족·직장 동료와 비밀산타 추첨을 무료로, 광고·비밀번호 없이 마법 링크로 로그인하고 코드 공유로 진행합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Tracking AJ's road coffee orders
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
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