Repository navigation
Home
Tachyon is a fast, modern and secure web based email client. It is written in PHP with a JavaScript frontend, speaks IMAP and SMTP, and is built to stay small and to keep your users' data to itself.
It is a fork of SnappyMail, which itself forked RainLoop Webmail. Existing SnappyMail installations upgrade in place: the data directory and the configuration are unchanged, and plugins written against the RainLoop\ or SnappyMail\ namespaces keep working through compatibility shims.
What it gives you:
- IMAP and SMTP only, no POP3, with support for the modern IMAP extensions your server offers. See IMAP capabilities
- End to end encryption with OpenPGP in the browser, GnuPG on the server, and S/MIME
- Contacts with CardDAV synchronisation and contact groups
- Calendar with CalDAV synchronisation
- A Sieve filter editor for server side rules
- Searching on the server, across subfolders where the server allows it
- Themes, including a light and dark mode
- Runs standalone, or as a Nextcloud app
- No trackers, no third party calls, no phoning home
Requires PHP 8.2 or newer with the mbstring extension.
For a detailed overview on installing Tachyon, please see the installation instructions.
Tachyon is also available as a Nextcloud app on the Nextcloud App Store.
Administrators should also read the admin manual, which documents every setting.
To learn how to contribute code to Tachyon, please see the contributing instructions.
Changes made since the fork from SnappyMail:
- Calendar over CalDAV, with month, week, day and list views, drag to move, and an editor. Several calendars per account, each with the colour and read-only state the server reports. Recurrence expands correctly across timezones and daylight saving, and all-day events stay date-only. Off by default
-
Contact groups, using the standard vCard
CATEGORIESfield, so they survive a CardDAV round trip. Contacts can be filtered by group, and typing a group name while composing inserts a chip that expands to its members only when the mail is sent - Bulk contact operations: select a page or everything matching the current filter, and keep that selection while paging. Writing to a selection can target To, Cc or Bcc, and suggests Bcc past a configurable threshold so a large To does not hand every address to every recipient
- Subfolder search, searching a whole folder subtree at once. Uses IMAP MULTISEARCH where the server has it, and otherwise falls back to searching each folder in turn. Results are grouped by folder
- Vector icons throughout, drawn in the current text colour so they follow the active theme. The interface previously drew most of its icons as emoji, which carried their own colours and ignored theming
- Dracula theme, with the Alucard light variant and a dark/light toggle that applies without reloading the page
- Tables in the HTML editor: insert, and add or remove rows and columns
- Three DAV bugs fixed affecting calendars and address books alike: credentials are now sent with the first request rather than only after a 401 challenge, collection permissions are read correctly, and the CardDAV connection test no longer authenticates with an encrypted copy of the password
- Nextcloud integration brought up to date, supporting Nextcloud 26 through 35, published on the Nextcloud App Store, and migrating an existing SnappyMail install in place
- S/MIME signing fixed for identities whose private key is not passphrase protected
- Backup and restore produce ordinary ZIP files and download directly rather than through base64 in JSON
- PHP 8.2 as the baseline, with the Nextcloud integration modernised to match
These changes came from SnappyMail and set it apart from RainLoop, and Tachyon keeps them:
- Privacy/GDPR friendly (removed Sentry, Gravatar, Facebook, Google, Twitter, DropBox, OwnCloud and X-Mailer links/inclusion)
- More secure admin hashing algorithm (uses password_hash/password_verify)
-
Added features/functionality:
- Auth failed attempts written to syslog (for fail2ban and others)
- Option to remove background/font colors from messages for real "dark mode"
- Modified Squire HTML editor as replacement for CKEditor
- Better memory garbage collection management
- Advanced Sieve filter scripts editor
- No user-agent detection (use device width)
- Split Admin specific JavaScript code from User code
-
More modern PHP approach:
- Replaced pclZip with PharData and ZipArchive
- Prefer the yaml extension, fallback to the old Spyc
-
Removed features/functionality:
- Background video support
- BackwardCapability (class \Tachyon\Account)
- ChangePassword (re-implemented as plugin)
- OAuth support (re-implemented as extensions, see FAQ)
- POP3 support (this fork supports only IMAP)
- Ongoing removal of old JavaScript code
- Dropped gulp-uglify in favor of gulp-terser
- Replaced webpack with rollup
This fork uses downsized/simplified versions of scripts and has no support for Internet Explorer, resulting in increased performance and a smaller pageload, which benefits mobile devices. Things might work in Edge 15-18, Firefox 47-62 and Chrome 54-68 due to one polyfill for array.flat().
- Removed pikaday
- Removed underscore
- Removed polyfills
- Removed Modernizr
- Removed nanoscroll
- Removed lightgallery
- Removed jQuery
- Removed matchmedia-polyfill
- Removed momentjs (use Intl)
- Removed opentip (use CSS)
Bytes, measured on Tachyon 4.0.1. The RainLoop column is version 1.15 for reference.
| File | RainLoop | Tachyon | Tachyon min | min + gzip | min + brotli |
|---|---|---|---|---|---|
admin.js |
2.170.153 | 85.778 | 42.225 | 14.182 | 12.704 |
app.js |
4.207.787 | 488.041 | 221.355 | 74.075 | 63.040 |
boot.js |
868.735 | 4.477 | 2.273 | 1.295 | 1.089 |
libs.js |
658.812 | 239.427 | 113.032 | 40.243 | 35.928 |
sieve.js |
0 | 91.415 | 45.377 | 11.092 | 9.906 |
calendar.js |
0 | 130.062 | 129.224 | 41.429 | 36.737 |
serviceworker.js |
0 | 285 | 223 | 192 | 130 |
polyfills.js |
334.608 | 0 | 0 | 0 | 0 |
What a user actually downloads is boot, libs and app, so roughly 337 KB minified, or about 116 KB over gzip and 100 KB over brotli. The equivalent in RainLoop 1.15 was around 1.2 MB minified.
sieve.js is fetched only when the filters screen is opened, and calendar.js only when the calendar is. Neither counts towards that figure, and an installation that leaves the calendar disabled never downloads it at all. calendar.js is already minified upstream, which is why minifying it again barely changes the size.
| File | RainLoop | Tachyon | Tachyon min | min + gzip | min + brotli |
|---|---|---|---|---|---|
app.css |
340.331 | 159.792 | 137.845 | 23.552 | 20.590 |
boot.css |
2.427 | 2.137 | 912 | 785 | |
admin.css |
95.058 | 86.708 | 13.178 | 11.758 | |
calendar.css |
0 | 15.538 | 15.377 | 3.195 | 2.797 |
app.css grew when the icon font was replaced by inline SVG masks: about 5 KB more over gzip, against a 7.8 KB font file and a request no longer fetched.
The Squire implementation shows the overhead CKEditor carried.
| normal | min | min gzip | |
|---|---|---|---|
| squire | 115.520 | 47.548 | 14.867 |
| ckeditor | ? | 520.035 | 155.916 |
Bidirectional text is supported, through the left to right and right to left buttons in the editor toolbar.
Tables can be created and edited since 4.0: insert a table, and add or remove rows and columns from the editor toolbar.