project
Remind Me
Passwordless recurring reminders, delivered to your inbox.
Not interested in running your own instance? The hosted version at remindme.penman.dev is open to anyone — sign up with an email address and you're ready to go.
Works in any modern browser. No password — sign in with an email code or a passkey.
Remind Me is a serverless reminder service that emails you on whatever schedule you choose. Sign up with an email address, write a reminder with a message and a recurring cron schedule, and walk away — a Worker fires every five minutes and sends anything that's due via Mailgun.
There is no password. Sign in with a one-time code sent to your email, or register a passkey for instant future logins with Touch ID, Face ID, or a hardware key. The admin allow-list lives in a Cloudflare secret rather than a database flag, so privilege escalation requires controlling the deploy account.
Everything needed to run your own instance is in the public repo. The only bill you'll see is $0 — Cloudflare's free tier covers Workers, D1, and KV, and Mailgun's Foundation tier covers the sends. Fork the repo, set a handful of secrets, run npm run deploy, and it's live.
Schedule
message + cron
+ email address
saved to D1
Cron tick
every 5 min
checks what's due
6 min lookahead
Mailgun
email dispatched
via API
Inbox
reminder arrives
one-click actions
included
Passwordless auth
Sign in with a one-time code emailed to you. Optionally register a WebAuthn passkey for instant future logins with Touch ID, Face ID, or a hardware key.
Flexible schedules
Any valid cron expression works — daily, weekly, monthly, or custom. The scheduler looks 6 minutes ahead so reminders arrive on time, never late.
One-click inbox actions
Every reminder email includes HMAC-signed action links to pause or cancel directly from your inbox — no app sign-in required.
Bounce handling
Mailgun webhooks automatically flag hard bounces, complaints, and unsubscribes. Webhook deliveries are deduplicated in KV so retries are always a safe no-op.
Zero running cost
Cloudflare's free tier covers Workers, D1, and KV. Mailgun's Foundation tier covers the sends. No credit card required for personal use.
CI/CD auto-deploy
Push to main and GitHub Actions lints, runs tests, applies D1 migrations, and deploys to Cloudflare — migrations always land before new Worker code.
Fork, clone, and install
Requires Node.js 20+, a Cloudflare account (free tier), and a Mailgun account with a verified sending domain.
git clone https://github.com/KiwiGeek/RemindMe cd RemindMe npm install
Provision Cloudflare resources
Create a D1 database and a KV namespace, paste the returned IDs into wrangler.toml, then apply migrations.
npx wrangler login npx wrangler d1 create remindme npx wrangler kv namespace create KV npm run db:migrate:local npm run db:migrate:remote
Set production secrets
Copy .dev.vars.example to .dev.vars for local dev, then push each secret to Cloudflare for production.
npx wrangler secret put SITE_ORIGIN npx wrangler secret put MAILGUN_DOMAIN npx wrangler secret put MAILGUN_FROM npx wrangler secret put MAILGUN_API_KEY npx wrangler secret put MAILGUN_SIGNING_KEY npx wrangler secret put SESSION_SECRET npx wrangler secret put OTP_PEPPER npx wrangler secret put ACTION_TOKEN_SECRET npx wrangler secret put ADMIN_EMAILS
Deploy
A single command builds the Preact SPA, applies any pending migrations to production D1, and uploads the Worker bundle.
npm run deploy
Wire up Mailgun webhooks
In the Mailgun dashboard under Sending → Webhooks, point Permanent Failure, Temporary Failure, Spam Complaint, and Unsubscribes at your Worker URL.
https://<your-domain>/webhooks/mailgun