Tempik is the simplest email project in this Cloudflare run.
The previous posts were about real inboxes, AI agents, custom-domain webmail, and SaaS customer messaging.
Tempik is different:
disposable temp mail
receive-only
anonymous sessions
Cloudflare Workers + D1
That makes it useful, but it also makes the boundaries very clear.
This is not a private mailbox.
It is a self-hosted temp-mail service for throwaway addresses.
What Is Tempik?
Tempik describes itself as:
Disposable Temp Mail on Cloudflare Workers.
I inspected:
repo: https://github.com/hirotomasato/tempik
commit: 36d05edc7010039664716559acd3d623d5738188
version: 1.0.0
license: MIT
The app lets visitors create disposable addresses on your domain, receive email through Cloudflare Email Workers, and read those messages in a browser UI.
There is no VPS, no Postfix, no Docker, and no SMTP daemon.
What You Get
Tempik includes:
- disposable email inbox creation;
- random human-readable address generation;
- custom local-part creation;
- multiple configured mail domains through
MAIL_DOMAIN; - anonymous browser sessions;
- session-scoped inbox list;
- inbound email parsing with PostalMime;
- D1 message storage;
- Hono REST API;
- vanilla HTML/CSS/JavaScript web UI;
- Cloudflare Workers Assets for static files;
- Cloudflare Email Worker
email()handler.
It does not include:
- user accounts;
- passwords;
- API keys;
- outbound sending;
- attachments storage;
- message expiration;
- automatic cleanup;
- OAuth;
- MCP;
- PWA install manifest;
- Docker deployment.
That makes it smaller than every other email app we covered recently.
And for disposable mail, smaller is not necessarily bad.
Stack
The stack is:
| Layer | Tempik uses |
|---|---|
| Runtime | Cloudflare Workers |
| Inbound email | Cloudflare Email Workers / Email Routing |
| API router | Hono |
| Database | Cloudflare D1 |
| Static frontend | Workers Assets |
| Frontend | Vanilla HTML, CSS, JavaScript |
| Email parsing | PostalMime |
| Language | TypeScript |
| Deployment | Wrangler 4 |
The wrangler.toml is short:
name = "tempik"
main = "src/index.ts"
compatibility_date = "2025-06-01"
workers_dev = false
[[d1_databases]]
binding = "DB"
database_name = "tempik-db"
database_id = ""
[email]
action = "process"
[[routes]]
pattern = "tempik.YOURDOMAIN.com"
custom_domain = true
[vars]
APP_NAME = "Tempik"
MAIL_DOMAIN = "YOURDOMAIN.com"
WEB_HOST = "tempik.YOURDOMAIN.com"
[assets]
directory = "./src/web"
There are two handlers:
fetch()handles/api/*routes.email()handles inbound mail from Cloudflare Email Workers.
Static files come from:
src/web/index.html
src/web/app.js
src/web/styles.css
How Tempik Works
The flow is:
Sender
-> Cloudflare MX
-> Email Worker
-> PostalMime
-> D1
-> Hono API
-> browser UI
When mail arrives, Tempik:
- lowercases the sender and destination;
- parses the raw MIME stream with PostalMime;
- uses the text body when available, or HTML as fallback;
- auto-creates the target inbox if it does not exist;
- stores the message in D1.
The important part: inbound messages auto-create inbox records.
Then a browser session can create or claim an inbox address and read messages linked to that address.
Database Schema
Tempik uses four D1 tables:
| Table | Purpose |
|---|---|
inboxes |
Disposable email addresses. |
messages |
Received email messages. |
sessions |
Anonymous browser sessions. |
session_inboxes |
Links inboxes to browser sessions. |
The message table stores:
id
inbox_address
from_address
subject
body
received_at
There is no attachments table and no retention policy in the inspected schema.
If you run this publicly, plan cleanup.
API
Tempik’s API lives under:
/api/
Authentication is an anonymous session token:
- Call
GET /api/session. - Store the returned
sessionId. - Send it as
x-session-id.
Important endpoints:
| Endpoint | Method | Purpose |
|---|---|---|
/api/config |
GET | Public app name, mail domains, and web host. |
/api/session |
GET | Create or reuse anonymous session. |
/api/inboxes |
GET | List inboxes linked to the session. |
/api/inboxes |
POST | Create or claim an inbox. |
/api/inboxes/:address |
DELETE | Unlink inbox from the session. |
/api/inboxes/:address/messages |
GET | Read messages for a linked inbox. |
Example:
SESSION=$(curl -s https://tempik.example.com/api/session | jq -r .sessionId)
curl -s -X POST https://tempik.example.com/api/inboxes \
-H "x-session-id: $SESSION" \
-H "Content-Type: application/json" \
-d '{"localPart":"demo"}'
curl -s https://tempik.example.com/api/inboxes/[email protected]/messages \
-H "x-session-id: $SESSION"
That makes Tempik easy to script, but it is not an authenticated API.
Self-Hosting Tempik
There is no Docker Compose setup for Tempik.
The deployment target is Cloudflare Workers.
Manual setup:
git clone https://github.com/hirotomasato/tempik.git
cd tempik
npm install
npx wrangler login
npx wrangler d1 create tempik-db
Copy the generated database_id into wrangler.toml.
Apply the schema:
npx wrangler d1 execute tempik-db --remote --file=src/db/schema.sql
Deploy:
npx wrangler deploy
Then verify Email Routing:
npx wrangler email routing settings YOURDOMAIN.com
npx wrangler email routing rules list YOURDOMAIN.com
The expected shape is a catch-all rule that sends mail for your domain to the Tempik Worker.
DNS and Email Notes
You need a domain on Cloudflare.
The web UI route points to a subdomain such as:
tempik.example.com
Mail receives on addresses under:
*@example.com
The README recommends adding an SPF record if one is not already present:
v=spf1 include:_spf.mx.cloudflare.net ~all
For disposable receive-only mail, deliverability is mostly about inbound routing working. Tempik does not send mail.
Security Reality Check
Tempik is disposable mail.
Do not use it for:
- bank logins;
- primary accounts;
- sensitive OTPs;
- private customer communication;
- long-lived account recovery;
- confidential documents.
The inspected code uses anonymous browser sessions. A session can only read inboxes linked to that session.
But inboxes can be claimed by address. If someone knows the exact disposable address, they can link that inbox to their own session through POST /api/inboxes and read messages stored for it.
That is acceptable for a temp-mail tool, but not for private email.
If you expose Tempik publicly, consider adding:
- automatic message expiration;
- automatic inbox expiration;
- rate limiting;
- abuse controls;
- attachment rejection or explicit attachment handling;
- domain/local-part restrictions;
- cleanup jobs;
- observability alerts.
Field Note: Local Trial
I tried the project locally in a temporary clone.
Environment:
node: v18.19.1
npm: 9.2.0
Commands:
npm install
npx wrangler --version
npx tsc --noEmit
npm install completed, but showed engine warnings for Wrangler, Miniflare, Undici, and Cloudflare packages.
npx wrangler --version failed on this machine:
Wrangler requires at least Node.js v20.0.0. You are using v18.19.1.
npx tsc --noEmit passed.
So the TypeScript source checks out, but local Worker/D1 testing and deployment need Node 20+.
I did not add a Home-Lab Compose file because this is not a Docker app.
How It Compares
| Project | Best fit | Deployment shape |
|---|---|---|
| Agentic Inbox | Cloudflare AI/MCP email demo | Cloudflare-native |
| Mailflare | Full custom-domain webmail/workspace, Docker option | Cloudflare or Docker |
| SaaSMail | SaaS customer timelines, templates, and sequences | Cloudflare-native |
| QuickInbox | Practical custom-domain inbox with API, CLI, PWA, MCP | Cloudflare-native |
| Tempik | Disposable receive-only temp mail | Cloudflare-native |
Tempik is the least cluttered.
It is also the least private, least durable, and least feature-complete by design.
FAQ
Is Tempik self-hosted?
Yes, in the Cloudflare-native sense.
You deploy the Worker, create the D1 database, configure Workers Assets, and route inbound email through your own Cloudflare domain.
It is not a VPS/Docker self-hosted app.
Does Tempik need Docker?
No.
The repo does not include Docker or Docker Compose. It is designed for wrangler deploy.
That is why I did not add a Home-Lab Compose file.
Does Tempik send email?
No.
Tempik is receive-only. It receives disposable email through Cloudflare Email Workers and stores messages in D1.
There is no outbound provider, SMTP relay, Resend integration, Cloudflare Email Sending binding, or send API in the inspected code.
Does Tempik support attachments?
Not as stored attachments.
PostalMime can parse MIME messages, but the inspected database schema only stores a text body field. There is no R2 bucket, no attachments table, and no attachment download API.
If you need attachments, QuickInbox or Mailflare are more relevant.
Can Tempik be deployed statically?
No.
The frontend is static HTML/CSS/JS, but the useful app needs Worker API routes, D1, and the Cloudflare email() handler.
Workers Assets serves the frontend; it does not replace the Worker backend.
Can anyone read an inbox if they know the address?
In practice, yes.
Tempik links inboxes to anonymous browser sessions, but POST /api/inboxes can create or claim an address and link it to the current session. Since inbound mail also auto-creates inbox records, someone who knows the exact disposable address can claim it.
That is normal for many temp-mail tools, but it means Tempik is not private email.
How does Tempik compare with the other Cloudflare email posts?
Tempik is the smallest and most disposable.
- Tempik: receive-only temporary mail, anonymous sessions, no outbound, no accounts.
- QuickInbox: real custom-domain inbox with API, CLI, PWA, MCP, and Resend/Cloudflare provider choice.
- SaaSMail: SaaS customer communication with templates, sequences, suppressions, and unsubscribe handling.
- Mailflare: broader custom-domain webmail/workspace with both Cloudflare and Docker deployment paths.
- Agentic Inbox: Cloudflare AI/MCP email architecture demo.
Pick Tempik when you want a throwaway inbox service, not a mailbox product.
How does Tempik relate to Mailpit, MailDev, Inbucket, and Notifuse?
These tools solve different email problems:
| Tool | Main job | Best environment | Sends to real people? |
|---|---|---|---|
| Tempik | Public/semipublic disposable inboxes on your domain | Cloudflare Workers | No |
| Mailpit | |||
| Catch outbound SMTP from apps for local testing | Docker/local dev/CI | No | |
| MailDev | |||
| Catch outbound SMTP with web UI/API for development | Docker/local dev/CI | No, unless relay is explicitly configured | |
| Inbucket | |||
| Disposable SMTP testing server with web UI, REST, and POP3 | Docker/dev/QA/staging | No | |
| Notifuse | |||
| Email marketing and transactional email platform | Docker/server app | Yes, through a configured provider |
The distinction:
- Tempik receives internet mail for disposable addresses on a real Cloudflare-routed domain.
- Mailpit/MailDev/Inbucket catch app-generated SMTP before it reaches the internet.
- Notifuse manages campaigns, contacts, templates, automations, and transactional flows, then hands delivery to a real provider.
Mailpit is especially interesting for homelab testing because it gives any self-hosted app a safe fake SMTP target:
your app -> SMTP mailpit:1025 -> Mailpit web UI at :8025
That is different from Tempik:
external sender -> Cloudflare Email Worker -> Tempik D1 inbox
Use Mailpit when you are testing whether Rallly, Ghost, Listmonk, Mautic, or another app generated the right email. Use Tempik when you want a throwaway address that can receive real inbound mail from outside.
What should I back up?
Back up D1 if you care about keeping disposable messages.
D1 contains inboxes, messages, anonymous sessions, and session-inbox links.
There is no R2 bucket in the inspected deployment, and attachments are not stored separately.
Conclusion
Tempik is refreshingly small.
It does one thing: disposable inbound email on Cloudflare Workers.
That simplicity is its strength. It also defines the limits.
Use Tempik for throwaway addresses, testing signups, demos, and short-lived receive-only mail.
Use QuickInbox, Mailflare, or SaaSMail when you need real inbox ownership, stronger identity, attachments, outbound sending, or production customer communication.
Final Use-Case Chooser
Here is the practical map I would use after looking at all these tools:
| Use case | Best fit | Why |
|---|---|---|
| Throwaway inbound addresses on your own domain | Tempik | Disposable receive-only inboxes, anonymous sessions, Cloudflare Email Workers, D1. |
| Personal/small-team custom-domain inbox on Cloudflare | QuickInbox | Real inbox UX, Resend-or-Cloudflare provider choice, REST API, CLI, PWA, MCP. |
| Broader webmail/workspace with Docker option | Mailflare | More complete mailbox/workspace features and a non-Cloudflare Docker path. |
| SaaS lifecycle messaging and sequences | SaaSMail | Templates, customer timelines, sequences, suppressions, unsubscribe handling. |
| Cloudflare AI/MCP email architecture study | Agentic Inbox | Best as a reference for Workers, Durable Objects, R2, Workers AI, Access, and MCP. |
| Local SMTP capture for app testing | Mailpit | Simple Docker SMTP catcher, great UI, default 1025 SMTP and 8025 web UI. |
| Alternative local SMTP catcher with API/MCP angle | MailDev | Development inbox with web UI/API and optional relay behavior. |
| Disposable SMTP testing server for QA/staging | Inbucket | SMTP intake plus web UI, REST, POP3, monitor view, retention controls. |
| Newsletters, transactional templates, automations, analytics | Notifuse | Email platform layer above SES/Postmark/Mailgun/Mailjet/etc. |
| Social outreach automation workflows | GrowChief | Outreach execution layer for scheduled social workflows, lead routing, and n8n-style automation. |
Mailpit is the one I would keep closest in a homelab dev stack: it answers “did my app generate the right email?” without involving real mailboxes.
Tempik answers a different question: “can I receive throwaway inbound mail on my own domain?”
Notifuse and GrowChief sit higher in the funnel. Notifuse is for email campaigns and transactional email operations. GrowChief is for social/outreach workflow execution, and should be treated carefully because account automation can violate platform terms.
Comments