Skip to content

Repository files navigation

Snooze for Thunderbird

Gmail-style snooze for Thunderbird. Press b, pick when you want a message back, and it disappears from your inbox until then.

Runs entirely on your machine. No account, no server, no Gmail API, no network access of any kind.

Quick menu Date & time picker
Snooze menu, light theme Calendar picker, light theme
Snooze menu, dark theme Calendar picker, dark theme

Real screenshots, captured automatically from a running Thunderbird 153 by scripts/visual_check.py.


The one important caveat

Messages come back only while Thunderbird is running.

There is no server involved, so nothing can move a message while Thunderbird is closed. If a message is due at 08:00 and Thunderbird is not running, it comes back the moment you next start it — not at 08:00. On a machine that is asleep overnight, "tomorrow at 8am" in practice means "when I next open Thunderbird".

If you need true cross-device, server-side snoozing, this add-on cannot provide it, and neither can any other Thunderbird add-on: Gmail's own snooze is not reachable over IMAP or via the Gmail API.

How it works

Snoozing moves the message into a Snoozed folder in the same account (on Gmail this shows up as a label) and writes a record to local storage. When the time comes, the message is moved back to the folder it came from, marked unread and tagged Snoozed.

Returns are driven three independent ways, so a missed one is unlikely:

  1. an alarm set for the exact next due time,
  2. a low-frequency sweep, in case an alarm is dropped, and
  3. a catch-up scan at startup, covering time when Thunderbird was closed.

Records are keyed by the message's Message-ID header, never by Thunderbird's numeric message id — the Thunderbird API documents that the numeric id "does not remain after a restart. Nor does it follow an email that has been moved to a different folder", and snoozing is a move. (There is an integration test that asserts the id really does change, so this cannot quietly regress.)

Install

Requires Thunderbird 128 or newer. Built and tested against 153.

git clone https://github.com/ContextLab/thunderbird-snooze
cd thunderbird-snooze
bash scripts/build.sh          # writes build/snooze.xpi

Then in Thunderbird: ☰ → Add-ons and Themes → ⚙ → Install Add-on From File… and choose build/snooze.xpi.

Thunderbird does not require add-ons to be signed, so this installs as-is.

This add-on includes an Experiment API, which is the only way to bind a bare letter key. Thunderbird therefore asks you to grant it "full, unrestricted access to Thunderbird and your computer" — that is the standard prompt for any add-on containing an experiment, not a request for anything beyond what is in this repository. All the code is here; the experiment is experiment/keys.js and does nothing but listen for one keypress.

Using it

Select a message (or several) and press b. You can also use the Snooze toolbar button, the button in the message reader, or right-click → Snooze….

Option When it comes back
Later today in 3 hours, rounded to the hour
Tomorrow tomorrow at 8:00 AM
This weekend Saturday at 8:00 AM
Next week Monday at 8:00 AM
Someday the 1st of next month, 8:00 AM
Pick date & time… whenever you choose

Options that do not apply are omitted rather than shown greyed out: "Later today" disappears late in the evening, and "This weekend" is hidden on a Friday because it would be the same moment as "Tomorrow".

The menu is fully keyboard-driven: ↑/↓ to move, Home/End, Enter to choose, Esc to close. In the picker, arrow keys move by day and week.

b is ignored while you are typing — in the quick filter, a search box, or a compose window.

Settings

☰ → Add-ons and Themes → Snooze → Options. You can change the morning / afternoon / evening times, the "later today" offset, which day counts as the weekend, the folder name, the shortcut key, and whether returned messages are starred. You can also disable the add-on per account, and see (or immediately return) everything currently snoozed.

What gets stored

Only in storage.local, on your machine:

  • the message's Message-ID, its account, source and Snoozed folder ids
  • the return time
  • the subject — shown in the Options page so you can tell your pending snoozes apart. It is cleared as soon as the message comes back.

No message bodies, no credentials, and nothing is ever sent anywhere.

Development

npm test                              # unit tests, across 7 timezones
python3 scripts/integration_test.py   # real Thunderbird, real messages
python3 scripts/visual_check.py       # screenshots, light + dark
bash scripts/build.sh                 # package the .xpi

Nothing is mocked anywhere in the test suite.

  • Unit tests (test/) cover the date math and persistence. The date math is a pure module with no browser.* dependency, so it runs directly under Node; npm test executes the whole suite under 7 timezones including two DST regimes and 45-minute offsets. Storage is exercised against a real file-backed implementation of the storage.local contract, so serialization and interleaving are real.
  • Integration tests (scripts/integration_test.py) build a throwaway Thunderbird profile with a Local Folders account, import real messages, and run the production modules against real folders and the real message database. A second launch verifies startup catch-up. No credentials and no IMAP are involved, and your own mail is never touched.
  • Visual checks (scripts/visual_check.py) drive the real add-on with a real b keystroke and photograph what Thunderbird actually renders. macOS only.

See docs/thunderbird-153-notes.md for behaviours of Thunderbird 153 that are undocumented or contradict the official documentation, and that cost real debugging time here.

Credits

The single-key technique — a privileged keydown listener installed on Thunderbird's chrome windows via an Experiment API, with a focus-aware guard so it does not fire while you type — follows tbkeys by Will Shanks (MPL-2.0). The approach is theirs; the implementation here was written from scratch and shares no code with it, so nothing in this repository is derived from MPL-licensed source.

License

MIT. See LICENSE.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages