Fixes silent data loss in contact and calendar sync, and a decryption bug that mangled non-ASCII text. Worth taking.
Most of this release comes from two people who filed unusually thorough reports: @m0urs, who ran Tachyon's calendar against Radicale with a large legacy dataset and found five real bugs, and @lvarnava, whose Nextcloud contact sync report turned out to be my fault.
Contact sync stopped losing contacts
Two separate causes, both silent.
Every contact Tachyon published to a CardDAV server carried a malformed REV. Contacts are stored internally as jCard, and the conversion back to vCard did not undo the format change, producing 2026-08-27T09:49:51Z where vCard 4.0 requires 20260827T094951Z. Nextcloud stored it and then failed to render the contact. From #30.
Separately, a contact whose birthday came from Apple (BDAY;VALUE=DATE,X-APPLE-OMIT-YEAR=...) was dropped entirely, while the sync still reported success. Apple writes that with a comma where the spec wants a semicolon, which was fatal under PHP 8. Such contacts now import whole, birthday included. From #37.
Both syncs now count what they could not store and say so, rather than reporting plain success. That was the thread running through several of these: losing data looked exactly like a clean run.
Calendar
Five fixes, all found by running against Radicale rather than Nextcloud.
- Sync no longer stops at the first event it cannot store.
locationwas limited to 255 characters and dates were held in 4-byte integers, so a long meeting location or a "repeats forever" date past 2038 aborted the whole calendar, permanently. Columns are widened, existing installs are migrated, and a single bad event is now skipped rather than taking the calendar with it. #35 - Discovery works against servers that answer the configured URL directly. Tachyon took the first
calendar-home-setin the response regardless of which resource it belonged to, so Radicale sent it to the server root and it reported no calendars for accounts whose calendars were exactly where the user said. #34 - All-day events no longer span an extra day. Every holiday and birthday arriving from an external calendar drew across two days. All-day boundaries are dates, and were being treated as instants, so UTC midnight became 02:00 local and bled into the following day. #38
- The event editor has a background again. It used two theme colours without fallbacks, and only 8 of the 22 shipped themes define them, Default not among them, so for most people the editor floated unstyled over the month grid. #36
Encrypted mail with umlauts
Non-ASCII characters in a decrypted PGP/MIME message came out as Verschl?sselter instead of Verschlüsselter. The text was decoded twice: once by OpenPGP.js and again by the MIME parser that knows the charset. Only affected receiving, which is why messages sent from Tachyon were always fine. #32
OpenPGP keyserver lookups
Key lookups by email address never worked. Only keys.openpgp.org was enabled, and it serves an address-to-key mapping solely for addresses the owner has confirmed by mail, so a published key still returned nothing. keyserver.ubuntu.com and pgp.mit.edu are now tried after it, and the search names the server it is on and the one the key came from. #25
The OpenPGP panel's "Import from server" button also did nothing visible in any outcome, success or failure. It now reports what happened, and is renamed to "Restore keys saved to my account" with an explanation, since it reads from your Tachyon account rather than a public keyserver.
Attachments
Previewable attachments now carry a small eye badge, so the preview can be found without hovering and can be reached on a phone or tablet, where hovering is not possible at all. #31
Upgrading
The calendar tables are altered on first run to widen four columns. All-day events created in Tachyon before this release are snapped to the nearest midnight when read, so they keep the date they were given.