5.4 KiB
carrier
A simple desktop client for Smol Mail. One compact window: the message list above, the article below. It's built on fumi-core, the reference CLI's own library, with a Relm4 (GTK4) UI made from libadwaita's own widgets, so it follows your theme and accent colour. One 32-byte seed is the only secret; mail stays sealed at rest and opens on demand.
What it does
- Create an identity from a seed, or restore one you already have. The seed shows once, at creation.
- Pin a server's key, either by pasting the operator's key or connecting and trusting what the server presents. Then register a username, or recall an address you already own.
- Fetch, read, reply to and send sealed mail. Your inbox, requests and sent mail each live in their own folder.
- Close a compose window from the sidebar and carrier saves it as a draft automatically. Drafts live beside your mail store, in a folder that shows up once you have one; Cancel is the only way to throw one away.
- Add your own
Key: valueheaders when writing mail, one per line under the subject. carrier checks each line against the frontmatter rules and won't let you override its own fields (subject, reply-to, in-reply-to, accept). When you open mail with custom headers, they show up between the meta line and the body, and replying offers to carry them into your draft, where you can still edit them. - Accept or block someone who writes to you with a self-certifying reply address. Accepting also attaches an accept token to that contact automatically.
- Import contacts from a smol:// link and see whether they're verified or just trust-on-first-use. Each contact's detail view names the server their address lives on, whether you've pinned that server's key, and a button to pin it if you haven't. Your own identity opens the same way, with a QR code next to your address in the header bar and your key, fingerprint and URI below.
- Turn on strict first contact to make carrier pause before writing to someone new whose address carries no key. With it on, carrier offers to fetch and pin the server's key first, so you can check it against what the operator published, before the send goes out. A smol:// address with a key that differs from the one on file asks before replacing it, strict mode or not.
- Rotate your key with a confirmation step and a network timeout. Export and import gsmol backups that never contain the seed. Log out to erase your local files and return to onboarding. Your preferences live in a small sidecar file next to the store, so they survive a restart.
Download
Each release carries its binaries on the forge: downloads for carrier.
Flatpak
flatpak install --user carrier-x86_64.flatpak
flatpak run com.randogoth.carrier
Windows
Download the installer and run it
Build
devbox run run # build release and launch
devbox run check # fmt --check, build, tests
devbox run test # tests only
Tests run offline against an in-memory store and cover seed and key parsing, listing and opening a sealed envelope end to end, importing a contact, a full backup round-trip, pin labels and the date formatter. scripts/devbox-libs.sh adds the GUI stack's runtime libraries (wayland, xkbcommon, EGL, vulkan) to the library path inside the devbox shell, since they're loaded at runtime and nothing that links the binary can provide them.
Packaging
Run devbox run package to build carrier and install it as a Flatpak, using com.randogoth.carrier.json. It picks up the binary, desktop file, metainfo and icon from the repo, and devbox provides the tooling (flatpak, flatpak-builder, appstreamcli). The one thing outside devbox is the flatpak runtime itself; install it once:
flatpak install --user flathub org.gnome.Sdk//51 org.freedesktop.Sdk.Extension.rust-stable//26.08
After that, carrier lives in your user flatpak and runs with flatpak run com.randogoth.carrier. Inside the sandbox it keeps its config under ~/.var/app/com.randogoth.carrier/config/carrier, so a flatpak install starts with a fresh identity rather than your dev build's account.
Windows
Install MSYS2 (winget install MSYS2.MSYS2), open the MSYS2 MINGW64 shell, and run the setup script from your carrier checkout:
git clone ssh://git@code.randogoth.com:2222/randogoth/carrier.git
cd carrier && windows/setup.sh
windows/setup.sh installs the GTK and Rust stack into MSYS2, clones fumi next to carrier if you don't already have it, builds carrier, and bundles carrier.exe with the GTK runtime into dist/ and a zip, a complete Windows distribution. carrier keeps its config in %APPDATA%\carrier. If MSYS2 updates its core mid-run, the shell may close; just rerun the script and it picks up where it left off. Cloning over SSH needs your key in ~/.ssh inside the MSYS2 home.
