jcoffey-dev bd6a605d61 Group six more clusters out of web/src/lib
Takes the flat module count from 66 to 42, continuing what admin/ and
calendar/ started.

  lib/mailbox/  archiveDate, emptyFolder, folderMove, labelTree,
                mailboxName, mailboxRoute
  lib/sieve/    sieve, sieveApply, sieveFolders
  lib/input/    keyboard, swipe, touch, listSelection, dropUpload
  lib/notify/   notify, webpush, webpushEnable
  lib/sw/       swCache, swFacts, staleBuild
  lib/text/     html, markdown, text, emlName

FOUR THINGS THE FILENAMES GET WRONG, each checked by reading the file
rather than trusting what it is called:

  - appFolder is not a mailbox. It is the `ihasmail` folder in JMAP
    *Files*, where the client keeps signature images and synced settings.
    It stays flat.
  - format holds no formatting of text. It re-exports the date and clock
    formatters, so it belongs with dates/datetime, not with text/.
  - preview is the file viewer deciding what it can show without
    downloading, and source is where to point someone asking for this
    instance's AGPL source. Neither is about text.
  - notify is not Web Push. It is the tab title, the favicon badge and
    the new-mail sound -- in-app notification, which is why it sits with
    webpush rather than under sw/ with the service worker's own concerns.

threadScroll stays flat too: it decides where a conversation opens, which
is view state rather than a gesture, and input/ is honest only if
everything in it interprets something the reader did.

No behavior change. Almost every reference was on the @/ alias; eight
relative imports in files that did not move, or that moved away from a
sibling, needed rewriting by hand.
2026-09-15 23:17:50 -07:00

ihasmail

Try the demo
A working copy with an invented mailbox behind it — no sign-up, nothing real, nothing kept.

License: AGPL-3.0-or-later Requires Stalwart 0.16 or newer; tested against 0.16.22 Documentation: docs.ihasmail.org by Coffey Labs

ihasmail

Immutable webmail for Stalwart Mail Server. Mail, calendars, contacts, files and filters in one app that works as well on a phone as on a desktop — and a container with nothing to persist.

ihasmail talks only JMAP to Stalwart. There is no database, no IMAP or SMTP, and with IMMUTABLE=1 no writable filesystem either: everything durable, settings included, belongs to Stalwart, so the container is disposable.

🌐 ihasmail.org What it is, what it looks like, the full feature list
📘 docs.ihasmail.org Installing · Configuring · Using it · Shortcuts · Rebranding · Troubleshooting
📋 FEATURES.md Everything it does, feature by feature, with the capability each one needs
🧪 KNOWN-ISSUES.md What was verified live, and where Stalwart departs from a spec
🛣 ROADMAP.md What ihasmail does not do, and why

Screenshots

Inbox & conversation (dark) Inbox, dark theme Inbox & conversation (light) Inbox, light theme
Composer Composer Calendar Calendar
Contacts Contacts Sieve filter builder Filters

Taken against the built-in mock with sample data. More, including the phone layout, on ihasmail.org.

What's in it

  • Mail — conversations, labels, search operators, keyboard shortcuts, scheduled and undo send, invitations and RSVP, filters made from a message
  • Calendar — month, week, day and agenda views, recurrence, attendees and free-busy
  • Contacts — address books, groups, vCard import and export
  • Files — browse, upload, move, share
  • Signature checking — S/MIME signed mail verified as you read it
  • Settings that follow the account, kept in the account's own storage on Stalwart
  • On a phone — swipe to archive or delete, pull to refresh, hold to select
  • Administration — a dashboard, accounts, groups, mailing lists, roles, tenants and domains, each shown only when the Stalwart role allows it
  • Ten interface languages and twelve themes — the nine translations are marked Beta until a native speaker has read them
  • Platform — installable PWA, Web Push, mailto: handler, no credentials in the browser, strict CSP

The long version is FEATURES.md and ihasmail.org.

Requirements

Stalwart 0.16 or newer — sign-in refuses anything older, by name. Tested against 0.16.22; what changed in each release is in KNOWN-ISSUES.md.

Quick start (Docker)

cp .env.example .env
# edit: STALWART_URL=https://mail.example.com  and  APP_SECRET=$(openssl rand -base64 48)
docker compose up --build -d
# → http://localhost:8080 — put a reverse proxy in front for TLS

Or pull the published image, ghcr.io/coffey-labs/ihasmail. Releases are weekly, so it is usually a few days behind main.

People sign in with their Stalwart mailbox credentials. An account with two-factor authentication needs an app password, created in Stalwart's own settings.

Everything else — TLS, running immutably, several Stalwart servers, settings the installation decides, every environment variable — is in Installing and Configuring.

Development

npm install
npm run dev:mock     # built-in mock Stalwart ([email protected] / demo)
npm test

Architecture, the mock's switches and how versions are numbered are in CONTRIBUTING.md.

Contributing

CONTRIBUTING.md · CODE_OF_CONDUCT.md · SECURITY.md — please report vulnerabilities privately.

License

Copyright (C) 2026 Coffey Labs — AGPL-3.0-or-later. See LICENSE.

If you run a modified ihasmail, set SOURCE_URL to your own repository: the sign-in page and Settings About both show it. See Rebranding.

S
Description
Imported from github.com during the 2026-09-20 standup (local dir: ihasmail-inbuxa)
Readme AGPL-3.0
7.5 MiB
Languages
TypeScript 94.8%
CSS 2.9%
JavaScript 1.7%
Python 0.3%
Shell 0.2%