Technical
Technical overview
The Letos architecture (app, sync server, web version), supported platforms, the sync model, limits, offline behaviour, export and contact.
On this page
Architecture
| Part | What it is |
|---|---|
| Desktop app | Tauri 2: a Rust core with a React interface. Data lives in a local SQLite database, encrypted on the Mac (SQLCipher, key in the system keychain), and mailbox passwords sit in the same keychain. It fetches mail over IMAP/SMTP and Gmail and the calendar from Google Calendar — directly, with no middleman. |
| iOS app | The same Rust core and the same interface, adapted for the phone. Its database is encrypted just like the Mac’s. |
| Sync server (relay) | A Rust server that stores and forwards encrypted changes between devices and manages Letos accounts (sign-in, devices, invites, plan). It can’t see the content. |
| Web version | The same interface in your browser. It runs on our server, where each web account has its own database. You sign in with your Letos account. |
More about data and encryption in Privacy and security.
Supported platforms
| Platform | Version |
|---|---|
| macOS | 12 or later (Apple Silicon and Intel) |
| iOS | 15 or later |
| Web | a current browser |
| Windows, Linux | Coming |
Local AI needs a Mac with Apple Silicon and at least 16 GB RAM. The Control Center control on the iPhone needs iOS 18.
Sync model
- Each change (a task, a thread’s state, a rule, a setting…) is written as an entry into a local change log and sent to the server in an encrypted batch.
- The order of changes is set by hybrid logical clocks. When the same record is edited on two devices at once, the newer write wins (row-level last-writer-wins).
- A device syncs with the server every 30 seconds. When it has the channel for instant notifications open, it hears about a new change right away and the regular sync runs every 2 minutes. When the server can’t be reached, it waits longer and longer, at most 15 minutes.
- Mail and events don’t sync through the server — each device downloads them from the provider itself.
Offline
Everything important runs locally. Without a connection you can read downloaded mail, work with tasks and look at your calendar. Changes are saved and sent once you’re online. Sending an e-mail waits in the outbox.
Limits
| What | Limit |
|---|---|
| A task attachment that syncs | at most 25 MB (larger ones stay only on the device) |
| Number of devices, mailboxes and attachment storage | depends on the plan, see Pricing |
| Active yearly goals | 5 |
| Agents (MCP) | see Agents and MCP |
Mail cleanup: in Settings → Mail preferences → Mail cleanup you can have Letos free up message bodies and delete old messages from the device (30, 90, 180, 365 days, or Never). This affects only this device; the mail stays on your provider’s server. Nothing is deleted until you start the cleanup yourself.
Export and import
- letos.md — a one-page summary of your year to copy (see Tasks).
- Trello — a one-time import of a board from JSON into Tasks.
- Your mail stays with your provider, your calendar in Google Calendar.
Animations, settings search and bug reports
- Reduce motion — in Settings → Appearance you choose Follow system (default), Reduce or Full motion. It reduces animations and transitions where possible. The choice syncs between your devices.
- Search settings — the field at the top of Settings searches all tabs and finds settings by name. It works in the desktop app and on iPhone.
- Report a bug with diagnostics — you can attach diagnostics to your feedback (Settings → Diagnostics → Send feedback): technical data without personal data (app version, platform, language, module and recent error codes, never any content). Before sending, the preview Exactly this will be sent: shows you what goes out.
Data export
- In Settings → Export data, Export data… downloads everything you have in Letos as one ZIP archive: tasks, goals and notes (JSON), calendars (ICS), the mail stored on this device (mbox) and your settings. Passwords and access tokens are not part of the archive.
- Mail is only what is stored on this device. Nothing is downloaded from the server for the export.
- The Also include my Letos account data from the server switch adds your profile, devices, attachments and consents stored on the server. The server allows one such export per minute.
- The archive is built in phases (Tasks, goals and notes → Calendars → Mail → Settings → Finishing the archive) and shows its progress. You can cancel the export (Cancel export); after a cancel no file is created.
- Data export is available only in the desktop and iPhone apps.
Backup and restore
- In Settings → Diagnostics (on the iPhone in Settings, section Diagnostics) there is Data backup: Back up saves your tasks, goals and settings to a file on this device. Nothing is uploaded, and mail is not backed up — it stays at your provider.
- Restore from backup first shows what the file contains (The backup contains {tasks} tasks ({goals} of them goals) and {settings} settings.) and only then do you confirm with Merge and restore.
- Restoring merges the backup into your data; it never deletes: it brings back tasks and goals that are missing or were deleted, and replaces only task copies that are older than the backup. Tasks that are not in the backup stay. Newer edits from any device win, including on your other devices after you next sign in to your Letos account. Settings you already have are not changed.
- Before a restore Letos saves a copy of your current data (on this device only) and shows you the path afterwards. The file is deleted automatically after 7 days at the latest.
- Restoring is only available after signing out of your Letos account — otherwise sync would undo it. Your data stays unchanged.
- If a restore fails, your data stays unchanged and Letos says why.
Encrypted database
- The database on this device is encrypted — on macOS and iOS. The first launch after an update encrypts it once; you see Encrypting your data… and with a large mailbox it takes a moment. Keep the app open.
- If the database cannot be opened, Letos says The database could not be opened and your data on disk stays unchanged. Close the app and open it again; if it keeps happening, send us the text from the screen.
- If the key to the database is missing (for example after restoring the device from a backup), Letos offers Start over (your data downloads again from sync): it sets the unreadable database aside next to the new one (nothing is deleted) and downloads your mail, calendar and tasks again from the servers and from sync. Unsent drafts and changes that had not synced yet will not appear in it.
- A copy of the database file taken after encryption cannot be read without the key from the keychain.
Self-hosting
Running your own sync server isn’t supported or documented for users yet.
Service status and contact
We don’t have a separate service status page yet. The most common error messages and what to do about them are in When something goes wrong. If something isn’t working or you have a question, write to [email protected]. It helps to include what happened and, if useful, the log (Settings → Diagnostics → Open logs folder) — check it before sending, as it can contain e-mail addresses and message subjects.
Last updated: