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 |
|---|---|
![]() |
![]() |
![]() |
![]() |
Real screenshots, captured automatically from a running Thunderbird 153 by
scripts/visual_check.py.
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.
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:
- an alarm set for the exact next due time,
- a low-frequency sweep, in case an alarm is dropped, and
- 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.)
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.xpiThen 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.jsand does nothing but listen for one keypress.
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.
☰ → 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.
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.
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 .xpiNothing is mocked anywhere in the test suite.
- Unit tests (
test/) cover the date math and persistence. The date math is a pure module with nobrowser.*dependency, so it runs directly under Node;npm testexecutes the whole suite under 7 timezones including two DST regimes and 45-minute offsets. Storage is exercised against a real file-backed implementation of thestorage.localcontract, 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 realbkeystroke 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.
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.
MIT. See LICENSE.



