feat: package the app as a flatpak

This commit is contained in:
randogoth 2026-10-03 11:29:06 +03:00
parent 8e9d2a92a6
commit 080b47b24f
11 changed files with 135 additions and 1 deletions

2
.gitignore vendored
View file

@ -1,4 +1,6 @@
/target /target
.flatpak
.flatpak-builder
result result
result-* result-*
*.key *.key

View file

@ -38,3 +38,18 @@ The tests run offline against an in-memory store: seed and key parsing, a sealed
## Status ## 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. 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.
## Packaging
`devbox run package` builds and installs the app as a Flatpak from
`com.randogoth.carrier.json` — the binary, the desktop file, the metainfo and
the icon all come from the repo, and the tooling (`flatpak`, `flatpak-builder`,
`appstreamcli`) lives in the devbox environment. The flatpak runtime is the one
dependency outside devbox; install it once:
flatpak install --user flathub org.gnome.Sdk//51 org.freedesktop.Sdk.Extension.rust-stable//26.08
The result is installed into the user flatpak and runs as
`flatpak run com.randogoth.carrier`. Inside the sandbox the app keeps its
config under `~/.var/app/com.randogoth.carrier/config/carrier`, so a flatpak
install starts with a fresh identity rather than the dev build's account.

View file

@ -0,0 +1,69 @@
{
"id": "com.randogoth.carrier",
"runtime": "org.gnome.Platform",
"runtime-version": "51",
"sdk": "org.gnome.Sdk",
"command": "carrier",
"finish-args": [
"--socket=wayland",
"--socket=fallback-x11",
"--device=dri",
"--share=network"
],
"add-extensions": {
"org.freedesktop.Sdk.Extension.rust-stable": {
"directory": "/usr/lib/sdk/rust-stable",
"version": "stable",
"bundle": false,
"autodelete": false,
"disable-filesystem": true
}
},
"build-options": {
"append-path": "/usr/lib/sdk/rust-stable/bin",
"build-args": [
"--share=network"
]
},
"cleanup": [
"/share/doc"
],
"modules": [
{
"name": "carrier",
"buildsystem": "simple",
"build-commands": [
"sed -i 's|../fumi/core|fumi/core|' Cargo.toml",
"cargo build --release --locked",
"install -Dm755 target/release/carrier /app/bin/carrier",
"install -Dm644 data/com.randogoth.carrier.desktop /app/share/applications/com.randogoth.carrier.desktop",
"install -Dm644 data/com.randogoth.carrier.metainfo.xml /app/share/metainfo/com.randogoth.carrier.metainfo.xml",
"install -Dm644 data/icons/com.randogoth.carrier.png /app/share/icons/hicolor/512x512/apps/com.randogoth.carrier.png",
"install -Dm644 data/icons/com.randogoth.carrier-256.png /app/share/icons/hicolor/256x256/apps/com.randogoth.carrier.png",
"install -Dm644 data/icons/com.randogoth.carrier-128.png /app/share/icons/hicolor/128x128/apps/com.randogoth.carrier.png"
],
"sources": [
{
"type": "dir",
"path": ".",
"skip": [
"target",
".git",
".jj",
".flatpak"
]
},
{
"type": "dir",
"path": "../fumi",
"dest": "fumi",
"skip": [
".jj",
".git",
"target"
]
}
]
}
]
}

View file

@ -0,0 +1,10 @@
[Desktop Entry]
Name=carrier
Comment=Minimalist smolmail client
Exec=carrier
Icon=com.randogoth.carrier
Terminal=false
Type=Application
Categories=Network;Email;
Keywords=mail;smolmail;fumi;
X-Purism-FormFactor=Workstation;Mobile;

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>com.randogoth.carrier</id>
<name>carrier</name>
<summary>Minimalist smolmail client</summary>
<metadata_license>CC0-1.0</metadata_license>
<project_license>Apache-2.0</project_license>
<description>
<p>carrier is 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 made from
libadwaita's own widgets. One 32-byte seed is the only secret; mail
stays sealed at rest and opens on demand.</p>
</description>
<launchable type="desktop-id">com.randogoth.carrier.desktop</launchable>
<releases>
<release version="0.1.0" date="2026-10-03"/>
</releases>
<content_rating type="oars-1.1"/>
</component>

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View file

@ -19,7 +19,10 @@
"nixpkgs#gdk-pixbuf", "nixpkgs#gdk-pixbuf",
"nixpkgs#harfbuzz", "nixpkgs#harfbuzz",
"nixpkgs#libadwaita", "nixpkgs#libadwaita",
"nixpkgs#adwaita-icon-theme" "nixpkgs#adwaita-icon-theme",
"nixpkgs#flatpak",
"nixpkgs#flatpak-builder",
"nixpkgs#appstream"
], ],
"shell": { "shell": {
"init_hook": [ "init_hook": [
@ -40,6 +43,9 @@
], ],
"check": [ "check": [
"cargo fmt --check && cargo build && cargo test" "cargo fmt --check && cargo build && cargo test"
],
"package": [
"flatpak-builder --force-clean --user --install-deps-from=flathub --install .flatpak com.randogoth.carrier.json"
] ]
} }
} }

View file

@ -47,10 +47,22 @@
"last_modified": "1970-01-01T00:00:00Z", "last_modified": "1970-01-01T00:00:00Z",
"resolved": "path:/nix/store/v8ynlbrldn7k8byb1kx0j0wka8dsbrw9-source?narHash=sha256-BZWCi9ZRJiARTuKTbbtvFTj7t1TK4G3UEckT3HyNfRg%3D#adwaita-icon-theme" "resolved": "path:/nix/store/v8ynlbrldn7k8byb1kx0j0wka8dsbrw9-source?narHash=sha256-BZWCi9ZRJiARTuKTbbtvFTj7t1TK4G3UEckT3HyNfRg%3D#adwaita-icon-theme"
}, },
"nixpkgs#appstream": {
"last_modified": "1970-01-01T00:00:00Z",
"resolved": "path:/nix/store/v8ynlbrldn7k8byb1kx0j0wka8dsbrw9-source?narHash=sha256-BZWCi9ZRJiARTuKTbbtvFTj7t1TK4G3UEckT3HyNfRg%3D#appstream"
},
"nixpkgs#cairo": { "nixpkgs#cairo": {
"last_modified": "1970-01-01T00:00:00Z", "last_modified": "1970-01-01T00:00:00Z",
"resolved": "path:/nix/store/v8ynlbrldn7k8byb1kx0j0wka8dsbrw9-source?narHash=sha256-BZWCi9ZRJiARTuKTbbtvFTj7t1TK4G3UEckT3HyNfRg%3D#cairo" "resolved": "path:/nix/store/v8ynlbrldn7k8byb1kx0j0wka8dsbrw9-source?narHash=sha256-BZWCi9ZRJiARTuKTbbtvFTj7t1TK4G3UEckT3HyNfRg%3D#cairo"
}, },
"nixpkgs#flatpak": {
"last_modified": "1970-01-01T00:00:00Z",
"resolved": "path:/nix/store/v8ynlbrldn7k8byb1kx0j0wka8dsbrw9-source?narHash=sha256-BZWCi9ZRJiARTuKTbbtvFTj7t1TK4G3UEckT3HyNfRg%3D#flatpak"
},
"nixpkgs#flatpak-builder": {
"last_modified": "1970-01-01T00:00:00Z",
"resolved": "path:/nix/store/v8ynlbrldn7k8byb1kx0j0wka8dsbrw9-source?narHash=sha256-BZWCi9ZRJiARTuKTbbtvFTj7t1TK4G3UEckT3HyNfRg%3D#flatpak-builder"
},
"nixpkgs#gcc": { "nixpkgs#gcc": {
"last_modified": "1970-01-01T00:00:00Z", "last_modified": "1970-01-01T00:00:00Z",
"resolved": "path:/nix/store/v8ynlbrldn7k8byb1kx0j0wka8dsbrw9-source?narHash=sha256-BZWCi9ZRJiARTuKTbbtvFTj7t1TK4G3UEckT3HyNfRg%3D#gcc" "resolved": "path:/nix/store/v8ynlbrldn7k8byb1kx0j0wka8dsbrw9-source?narHash=sha256-BZWCi9ZRJiARTuKTbbtvFTj7t1TK4G3UEckT3HyNfRg%3D#gcc"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB