Skip to content
Kim Schulz edited this page Oct 15, 2026 · 7 revisions

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.

Installation

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.

Development

To learn how to contribute code to Tachyon, please see the contributing instructions.

What Tachyon adds

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 CATEGORIES field, 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

Inherited from SnappyMail

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

Removal of old JavaScript

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)

Size comparison

Bytes, measured on Tachyon 4.0.1. The RainLoop column is version 1.15 for reference.

JavaScript

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.

CSS

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.

Replaced CKEditor with Squire

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.

Clone this wiki locally