No description
Find a file
2026-10-03 00:40:53 +03:00
scripts refactor: migrate the UI to GTK4 with Relm4 and libadwaita 2026-10-03 00:40:53 +03:00
src refactor: migrate the UI to GTK4 with Relm4 and libadwaita 2026-10-03 00:40:53 +03:00
.gitignore feat: build carrier, a minimalist Iced smolmail client on fumi-core 2026-10-01 23:45:24 +03:00
Cargo.lock refactor: migrate the UI to GTK4 with Relm4 and libadwaita 2026-10-03 00:40:53 +03:00
Cargo.toml refactor: migrate the UI to GTK4 with Relm4 and libadwaita 2026-10-03 00:40:53 +03:00
devbox.json refactor: migrate the UI to GTK4 with Relm4 and libadwaita 2026-10-03 00:40:53 +03:00
devbox.lock refactor: migrate the UI to GTK4 with Relm4 and libadwaita 2026-10-03 00:40:53 +03:00
README.md refactor: migrate the UI to GTK4 with Relm4 and libadwaita 2026-10-03 00:40:53 +03:00

carrier

A minimalist desktop client for Smol Mail: one compact window — the list above, the article below — built on fumi-core, the reference CLI's own library, with a Relm4 (GTK4) UI built from libadwaita's own widgets, so it follows the user's 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 or restore an identity from a seed, shown once at creation time.
  • Pin a server's key — paste the operator's, or connect and pin what it presents — then register a username or recall an existing address.
  • Fetch (with cancel), read, reply and send sealed mail; the inbox, the requests tier and sent copies each keep their own folder.
  • Accept or block a requester when their mail carried a self-certifying reply address; accept tokens attach to accepted contacts automatically.
  • Contacts with verified/tofu marks and smol:// import; your own address as a URI, a QR code and a clipboard line.
  • Key rotation with a confirm-first step, server pin management, a network timeout, and gsmol backup export/import that never contains the seed.

Layout

src/main.rs   config directory, demo seeding, launch
src/app.rs    state and update; blocking calls run on the worker pool
src/view.rs   the Relm4 component: widgets, the op adapter, the re-render
src/ops.rs    fumi-core calls, key/read-mark files, and the offline tests

State

Everything lives under $XDG_CONFIG_HOME/carrier (default ~/.config/carrier): carrier.key is the master seed, written 0600; carrier.db is fumi-core's sealed store; read.txt is carrier's own read marks, one hex id per line.

Run and verify

devbox run run      # build release and launch
devbox run check    # fmt --check, build, tests
devbox run test     # tests only

The tests run offline against an in-memory store: seed and key parsing, a sealed envelope listed and opened end to end, contact import, a full backup round-trip, pin labels and the date formatter. scripts/devbox-libs.sh puts the GUI stack's runtime libraries (wayland, xkbcommon, EGL, vulkan) on the library path inside the devbox shell — they are dlopened, so nothing that links the binary can provide them.

Status

Work in progress: the UI is unexercised against a live server — the store, crypto and address paths are covered by tests, the network flows (register, fetch, send, rotate) are wired to fumi-core's operations but only smoke-tested as far as launching the window.