No description
Find a file
randogoth 6172df3e00
Some checks failed
CI / macos (push) Successful in 44s
CI / linux (push) Successful in 4m16s
CI / windows (push) Has been cancelled
docs: add license, third-party notices, AI declaration, and a download section
2026-10-09 13:37:15 +03:00
.forgejo/workflows feat: ship an Inno Setup installer from the windows release job 2026-10-09 10:42:50 +03:00
data chore: bump version to 0.2.0 2026-10-08 22:58:45 +03:00
docs/screenshots docs: add license, third-party notices, AI declaration, and a download section 2026-10-09 13:37:15 +03:00
locales/en-US docs: add license, third-party notices, AI declaration, and a download section 2026-10-09 13:37:15 +03:00
scripts refactor: migrate the UI to GTK4 with Relm4 and libadwaita 2026-10-03 00:40:53 +03:00
src fix: no console window and a writable config dir on Windows 2026-10-09 10:42:50 +03:00
windows feat: ship an Inno Setup installer from the windows release job 2026-10-09 10:42:50 +03:00
.gitignore feat: ship an Inno Setup installer from the windows release job 2026-10-09 10:42:50 +03:00
AI-DECLARATION.md docs: add license, third-party notices, AI declaration, and a download section 2026-10-09 13:37:15 +03:00
build.rs feat: embed the carrier icon in the Windows exe 2026-10-03 14:01:10 +03:00
Cargo.lock chore: bump version to 0.2.0 2026-10-08 22:58:45 +03:00
Cargo.toml chore: bump version to 0.2.0 2026-10-08 22:58:45 +03:00
com.randogoth.carrier.json feat: package the app as a flatpak 2026-10-03 12:17:15 +03:00
devbox.json Revert flatpak to building from source; add appstream package 2026-10-07 21:26:53 +03:00
devbox.lock Revert flatpak to building from source; add appstream package 2026-10-07 21:26:53 +03:00
LICENSE docs: add license, third-party notices, AI declaration, and a download section 2026-10-09 13:37:15 +03:00
README.md docs: add license, third-party notices, AI declaration, and a download section 2026-10-09 13:37:15 +03:00
THIRD_PARTY_NOTICES.md docs: add license, third-party notices, AI declaration, and a download section 2026-10-09 13:37:15 +03:00

carrier

License: Apache-2.0 Built with Devbox AI-DECLARATION: copilot

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.

carrier showing an inbox and an open message

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: value headers 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.