Skip to content

Repository files navigation

Global Entry Appointment Alerts

Free, real-time push notifications when Global Entry appointment slots open up at your enrollment center.

getglobalentryalerts.com →

Live GitHub Stars License


What it does

Pick your enrollment center once; get a push within ~1 minute when a slot opens (ntfy and/or browser/PWA). Free, open source (MIT), no signup — your ntfy topic and/or this device only. Stops after 30 alerts or 30 days.

Quick start

  1. Optional: ntfy on iOS or Android — create a unique topic.
  2. getglobalentryalerts.com — pick center, ntfy and/or This device, submit.

This device — allow notifications when prompted:

  • iPhone / iPad (iOS 16.4+, Safari) — ShareAdd to Home Screen, then open from that icon. Required; Safari does not support push in a normal tab.
  • Android (Chrome) — allow in the browser tab. Optional: Install app or Add to Home screen.
  • Mac (Safari 16+, macOS 13+) — allow in Safari; works in a regular tab.
  • Desktop (Chrome, Edge, Firefox) — allow in the browser; works in a regular tab.

How it works

We check CBP's public scheduler every minute for your center. If a slot appears before your latest date, you get ntfy and/or web push; then the subscription ends after 30 alerts or 30 days.

For developers

Go · Lambda · MongoDB Atlas · ntfy.sh · Web Push (VAPID) · CDK. Needs AWS CLI, CDK, Docker.

git clone https://github.com/arun0009/global-entry-appointment.git && cd global-entry-appointment
# export AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, AWS_ACCOUNT

env.json: MONGODB_PASSWORD, RECAPTCHA_SECRET_KEY, optional VAPID keys (npx web-push generate-vapid-keys). VAPID_SUBJECT = bare email, not mailto:… (Apple 403 otherwise).

MongoDB indexes
db.subscriptions.createIndex({ location: 1, ntfyTopic: 1 }, { unique: true, partialFilterExpression: { ntfyTopic: { $gt: "" } } });
db.subscriptions.createIndex({ location: 1, "webPushSubscriptions.endpoint": 1 }, { unique: true, partialFilterExpression: { "webPushSubscriptions.0": { $exists: true } } });
db.subscriptions.createIndex({ lastNotifiedAt: 1, latestDate: 1 });
db.subscriptions.createIndex({ createdAt: 1 });
db.subscriptions.createIndex({ latestDate: 1 });

Drop a legacy non-partial unique on (location, ntfyTopic) if present.

make develop · make invoke · make test · make css · make deploy · make destroy

make css after Tailwind/HTML edits (npm install once). reCAPTCHA: register getglobalentryalerts.com and *.github.io.

Support

Free to use. If this saved you a refresh war, a coffee or a star is always welcome.

Buy me a coffee

License

MIT © 2026 Arun Gopalpuri

About

Global Entry Appointment Alerts

Topics

Resources

Stars

11 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages