Kai Ole Hartwig
s3mail · documentation

Features

A mailbox in the browser that knows nothing but your bucket: folders are S3 prefixes, state sits next to the mail, and what you sort, the second machine sees too.

  • Reading: index by range GET, HTML in a sandbox, images blocked, an SPF/DKIM/DMARC mark only on failure
  • Writing: replies in the thread, Bcc, attachments, no double send after a crash
  • Sorting: folders, tags, rules with evidence-based suggestions, search with filters, several mailboxes

Folders are real S3 prefixes

--prefix mail/ is the root. What sits directly below it is the inbox; subfolders are mail folders:

 

mail/                     ← prefix from the SES receipt rule   = inbox
mail/archive/             ← archive
mail/spam/                ← spam
mail/trash/               ← trash
mail/sent/                ← a copy of every sent mail
mail/drafts/              ← drafts, including Bcc and attachments
mail/customers/           ← created by you
mail/.s3mail-state.json   ← tags, read/unread, star, rules (snapshot)
mail/.s3mail-state/       ← the individual changes since the snapshot

 

Moving is CopyObject + DeleteObject. You see the folders in the S3 console, and the trash can be emptied by a lifecycle rule. The message id is the basename, not the full key; that is why everything you know about a mail survives moving it between folders.

Reading

Writing

Sorting, rules, search

Sorting

Rules

“Contains X in From/To/Subject/anywhere → folder + tags”, applied to new mail when indexing, first matching rule wins. A mail is sorted automatically only once; if you move it back, it stays. The automation never touches trash and spam.

Rule suggestions show what you already do by hand: “You moved 11 of 12 mails from news@shop.io to Advertising.” That rests on evidence, not taste: at least four mails from the same sender and at least 80 % of them in the same folder, the numbers shown alongside. Sender, folder and tags are evaluated, never a mail's content, without a network connection and without an API key. Rules and tag colours export as JSON; the import merges and never replaces.

Search

Free words in From/To/Subject/preview/tags, plus combinable filters:

 

invoice from:client@x.com subject:"Quote" after:2026-01-01 before:2026-08-01
has:attachment has:spam is:unread is:starred tag:important in:archive

 

The + in the sidebar remembers your own filters under a name. Like tags and rules they live in the bucket: the second machine sees them, and none of it disappears when somebody clears the browser cache.

For client work

Awaiting reply: what went out at least five days ago and nobody answered, longest wait first. Answered is judged by address, not by thread: a reply often arrives as a new mail, from a colleague of the person written to, or with a thread a ticket system cut off. History in the mail view shows every mail with that address across all folders.

Keyboard:n new message · j/k move · x select · s star · e archive · Del trash · / search.

Several mailboxes, three languages

One s3mail serves any number of mailboxes, info@ and support@ in the same bucket or in different AWS accounts, each with its own sender, signature and state. If one fails at start, the others come up anyway. The interface speaks German, English and Spanish; the search terms work in all three (from: as von: as de:). Folder names are real S3 prefixes and are only displayed, not translated.

Next

Back to s3mail

The overview: what makes s3mail s3mail, getting started, every chapter.

s3mail →
Back to s3mail

Access, encryption, state

The three checks on every request, encrypted buckets, shared state without a lock.

Read →
Access, encryption, state