No updates detected yet. GitHub releases will appear here.
Visualization of Untappd Beers & Travel
翻訳待ち
Loading the full README.
Read the full README ↗Every place I've checked in a beer on Untappd, on a map.
Locked visitors get /api/public: every check-in snapped to a city-level point
(1 decimal of lat/lng), with no venue names, photos, comments or check-in IDs.
Exact venues, photos and notes come from /api/private, which needs the site
password. The filtering happens on the server, not in the browser.
"Untappd at Home" check-ins are spread across Waterloo, London and Bayfield, ON (city centres only). Virtual venues pinned to Untappd's HQ are treated as having no location.
Never commit an export file - this repo is public. /data and *.export.json
are gitignored.
/api/sync reads your public Untappd profile page (shows new
check-ins instantly, with rating, serving and photo) and the RSS feed
(backup - it can lag an hour or more), and adds any check-ins it hasn't seen.
It runs when the site is opened (at most every 3 minutes), hourly from a
GitHub Action (.github/workflows/sync.yml), and from Sync now on /admin.
UNTAPPD_USERNAME to read a different profile (defaults to jameslegue).Import this repo into Vercel.
Storage → Create → Neon Postgres, connected to the project. This sets
DATABASE_URL. The table is created on first use.
Add environment variables:
SITE_PASSWORD - the unlock passwordSESSION_SECRET - a long random string (openssl rand -hex 32)CRON_SECRET - another long random stringUNTAPPD_RSS_URL - your feed URL from untappd.com/account/settings
(it has a private key in it - keep it out of the repo)Redeploy, unlock, and upload the export on /admin. Hit Sync now to
check the feed parses.
In GitHub → repo Settings → Secrets and variables → Actions:
CRON_SECRET - same value as in VercelSITE_URL - e.g. https://jimmylegs.beerThe hourly job skips itself until SITE_URL is set.
Photos are hotlinked from Untappd's S3. Newer uploads only exist at full size, so those go through Vercel's image optimizer (resized and cached).
npm install
node scripts/import-local.mts path/to/export.json # writes data/checkins.local.json
npm run dev # password is "dev"
Without DATABASE_URL the app reads and writes data/checkins.local.json.