Syncs your Foursquare/Swarm checkins to your ATProto PDS as com.barryfrost.checkin records. Runs on Val.Town's free tier as a 15-minute cron.
http://localhost:8765/callback as an allowed Redirect URI.FSQ_CLIENT_ID=<id> FSQ_CLIENT_SECRET=<secret> deno task bootstrap
A browser window will open. Log in and approve. The token is printed to your terminal — it doesn't expire.
fsq2pds.Install the vt CLI: https://docs.val.town/cli/
From this directory run vt push (or use the Val.Town editor to paste the files).
Set these environment variables in Val.Town settings:
| Variable | Value |
|---|---|
FSQ_OAUTH_TOKEN | Token from step 2 |
FSQ_API_VERSION | 20240101 |
BSKY_HANDLE | Your Bluesky handle |
BSKY_APP_PASSWORD | App password from step 3 |
Open cron.ts in Val.Town and add a cron trigger set to every 15 minutes.
First run: launch cursor set to ....Synced <id> (<venue>) → at://....https://pdsls.dev/at://<your-did>/com.barryfrost.checkin
{ "$type": "com.barryfrost.checkin", "createdAt": "2024-06-01T14:30:00.000Z", "location": { "$type": "community.lexicon.location.fsq", "fsq_place_id": "abc123def456", "name": "Blue Bottle Coffee", "latitude": "37.776", "longitude": "-122.418" }, "address": "123 High Street, London, UK", "category": "Coffee Shop", "comment": "Best flat white in town", "photos": [ { "image": { "$type": "blob", "ref": { "$link": "bafyrei..." }, "mimeType": "image/jpeg", "size": 245678 } } ] }
address, category, comment, and photos are all optional — omitted when the source checkin has no value for them. The lexicon doc itself is maintained in the barryfrost-v7 repo, not here.
deno task backfill to import historical checkins, and deno task backfill-shouts to add comment to already-synced records whose shout predates that feature.1024x1024 size. Skipped if >1MB or unreachable.backfill-shouts is a one-time exception that patches comment onto existing records.)seen_checkins table.