Back

project

Remind Me

Passwordless recurring reminders, delivered to your inbox.

Deployed on Cloudflare
TypeScript Hono Preact Cloudflare Workers D1 Mailgun

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.

Use Remind Me

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.

1

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
2

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
3

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
4

Deploy

A single command builds the Preact SPA, applies any pending migrations to production D1, and uploads the Worker bundle.

npm run deploy
5

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