Commit graph

47 commits

Author SHA1 Message Date
randogoth
d9798a18f1 fix: trim the body before signing it
The compose buffer was passed through verbatim, so whatever the author last
pressed ended up in the payload — usually a trailing newline. That is not
content, but it becomes content the moment it is signed, and nothing
downstream can remove it without invalidating the signature.

smolboid refuses any post whose text carries a line break, because a published
record is one line of a feed, so every post sent from carrier was rejected
with "contains TAB, LF, CR or U+2028". Trimming has to happen here, before the
seal, rather than at the receiver: stripping is not invertible, so a receiver
that trimmed could no longer rebuild the bytes the author signed.
2026-10-14 22:08:55 +03:00
randogoth
2dbf098c82 chore: bump version to 0.3.0
Some checks failed
CI / windows (push) Waiting to run
Release / windows (push) Waiting to run
CI / macos (push) Failing after 1m4s
Release / macos (push) Failing after 37s
CI / linux (push) Successful in 4m14s
Release / linux (push) Successful in 3m46s
Release / flatpak (push) Successful in 3m36s
Release / release (push) Successful in 34s
2026-10-14 17:40:02 +03:00
randogoth
32e2e2a8f2 feat: add multiple accounts with a sidebar switcher and per-account folders 2026-10-14 17:39:49 +03:00
randogoth
6172df3e00 docs: add license, third-party notices, AI declaration, and a download section
Some checks failed
CI / macos (push) Successful in 44s
CI / linux (push) Successful in 4m16s
CI / windows (push) Has been cancelled
2026-10-09 13:37:15 +03:00
randogoth
433573693c feat: ship an Inno Setup installer from the windows release job
All checks were successful
CI / macos (push) Successful in 43s
CI / windows (push) Successful in 2m15s
CI / linux (push) Successful in 2m16s
2026-10-09 10:42:50 +03:00
randogoth
6bb850b9af fix: no console window and a writable config dir on Windows 2026-10-09 10:42:50 +03:00
randogoth
4360e45233 feat: add windows runner CI and release jobs
Some checks are pending
CI / linux (push) Waiting to run
CI / macos (push) Successful in 43s
CI / windows (push) Successful in 9m5s
2026-10-09 07:04:47 +03:00
randogoth
e2795cfef9 chore: bump version to 0.2.0
Some checks failed
CI / macos (push) Successful in 52s
CI / linux (push) Successful in 2m37s
Release / linux (push) Successful in 2m33s
Release / flatpak (push) Successful in 1m39s
Release / macos (push) Successful in 39s
Release / release (push) Has been cancelled
2026-10-08 22:58:45 +03:00
randogoth
c2525fd0f0 refactor: flatten Fluent selectors into one message per variant 2026-10-08 22:32:52 +03:00
randogoth
06952cd20e docs: rewrite catalogue copy to the Microsoft Writing Style Guide 2026-10-08 22:27:25 +03:00
randogoth
57e75af3ac feat: extract all user-facing strings into a Fluent catalogue 2026-10-08 22:10:29 +03:00
randogoth
4c5665a6ff feat: gate first contact on a pinned server, confirm key changes 2026-10-08 21:36:02 +03:00
randogoth
743c388cfb feat: split settings into Identity, Server, Backup and Advanced tabs 2026-10-08 20:46:17 +03:00
randogoth
2892ea3fa7 feat: rework signup into a safer multi-step flow, add keep-mail setting 2026-10-08 19:58:50 +03:00
randogoth
53c9c4b8ce docs: mention factory reset in the feature list 2026-10-08 19:58:48 +03:00
randogoth
18befcc008 Revert flatpak to building from source; add appstream package
All checks were successful
CI / linux (push) Successful in 2m9s
Release / linux (push) Successful in 2m19s
Release / flatpak (push) Successful in 1m32s
Release / release (push) Successful in 10s
CI / macos (push) Successful in 39s
Release / macos (push) Successful in 34s
Reusing the linux job's binary (previous commit) doesn't work: it's
dynamically linked against ~100 libraries at absolute /nix/store
paths, including its own ELF interpreter, none of which exist inside
the Flatpak sandbox - confirmed locally via a real install+run
(execvp: No such file or directory). Reverted to building from source
inside flatpak-builder's sandbox via the rust-stable SDK extension,
same as the existing local `devbox run package` already does.

Also fixes two things needed for that in-sandbox build to work under
the forgejo-runner service (not an interactive session):
- appstreamcli (used by flatpak-builder to compose AppStream metadata)
  wasn't on PATH - added as a devbox package (linux-only, like
  gtk4/libadwaita) rather than a NixOS system package, keeping it
  scoped to the project.
- rofiles-fuse's mount/unmount cycle fails under the service context
  even though /dev/fuse itself is world-writable; --disable-rofiles-fuse
  is flatpak-builder's own documented workaround for this.

Verified locally: full build, appstreamcli compose, bundle install,
and the installed binary actually executing inside the sandbox.
2026-10-07 21:26:53 +03:00
randogoth
cf57009eeb Disable flatpak-builder's rofiles-fuse under the CI runner
Some checks failed
CI / macos (push) Waiting to run
CI / linux (push) Successful in 2m7s
Release / linux (push) Successful in 2m20s
Release / flatpak (push) Failing after 10s
Release / release (push) Has been skipped
Release / macos (push) Successful in 34s
rofiles-fuse's mount/unmount cycle fails under the forgejo-runner
systemd service ("Permission denied" / "Operation not permitted" on
fusermount3) even though /dev/fuse itself is world-writable - services
don't get the same mount-namespace treatment an interactive session
does. --disable-rofiles-fuse is flatpak-builder's own documented
workaround for exactly this class of environment (containers/CI).
2026-10-07 21:14:12 +03:00
randogoth
3183f15da6 Fix flatpak-builder defaulting to system scope in bundle-flatpak
Some checks failed
CI / macos (push) Waiting to run
CI / linux (push) Successful in 2m17s
Release / linux (push) Successful in 2m21s
Release / flatpak (push) Failing after 27s
Release / release (push) Has been skipped
Release / macos (push) Successful in 37s
Missing --user (present on the existing package script, omitted here
by mistake) made flatpak-builder try to install missing deps
system-wide, which this unprivileged CI user can't authorize via
polkit: "Flatpak system operation GetRevokefsFd not allowed for user".
2026-10-07 21:02:27 +03:00
randogoth
5d097143a5 Decouple macOS from the release job
Some checks failed
CI / macos (push) Waiting to run
CI / linux (push) Successful in 2m30s
Release / linux (push) Successful in 2m24s
Release / macos (push) Has been cancelled
Release / release (push) Has been cancelled
Release / flatpak (push) Has been cancelled
apfel is a laptop that's frequently asleep/offline; gating the release
on it (needs: [macos, linux, flatpak]) meant the whole release stalled
whenever it wasn't reachable. macos now appends its own asset directly
via the Forgejo API once it finishes, polling for the release that
linux+flatpak already created/overrode, instead of going through
actions/forgejo-release (which can only blind-create, not append to an
existing release).
2026-10-07 20:53:22 +03:00
randogoth
2d18caa500 Add Flatpak bundle to the release workflow
Some checks failed
Release / macos (push) Has been cancelled
Release / linux (push) Has been cancelled
Release / flatpak (push) Has been cancelled
Release / release (push) Has been cancelled
CI / macos (push) Has been cancelled
CI / linux (push) Has been cancelled
Builds carrier-x86_64.flatpak from the linux job's already-built binary
rather than recompiling inside flatpak-builder's sandbox (which can't
see the shared cargo cache anyway, making an in-sandbox build pure
duplicate work). com.randogoth.carrier.release.json is a separate
manifest from the main one, which stays as-is for local
`devbox run package` dev-from-source builds.
2026-10-07 20:39:57 +03:00
randogoth
1bbc961bd6 Fix release workflow: use Forgejo's upload/download-artifact fork
All checks were successful
CI / macos (push) Successful in 37s
Release / macos (push) Successful in 36s
CI / linux (push) Successful in 3m43s
Release / linux (push) Successful in 2m49s
Release / release (push) Successful in 11s
actions/upload-artifact@v4 and download-artifact@v4 use GitHub's newer
Artifacts-v2 protocol, which Forgejo's server explicitly refuses
("not currently supported on GHES"). Forgejo maintains its own forks
(forgejo/upload-artifact@v5, forgejo/download-artifact@v7) with that
check disabled. Also drops archive: false, an input that fork doesn't
expose - the earlier binary rename already keeps filenames distinct
through the default zip/extract round-trip.
2026-10-07 20:07:09 +03:00
randogoth
73408bdf24 Add tag-triggered release workflow
Some checks failed
CI / macos (push) Successful in 39s
Release / macos (push) Failing after 33s
CI / linux (push) Has been cancelled
Release / linux (push) Failing after 3m11s
Release / release (push) Has been skipped
Builds macos-arm64 and linux-x86_64 release binaries in parallel and
uploads them as build artifacts; a single release job gated on both
then downloads and publishes them to one Forgejo release. Splitting it
this way avoids a real race in actions/forgejo-release itself: its
script always does a blind create-then-upload for the tag with no
merge path, so two parallel callers against the same tag either
hard-fail or stomp each other's uploaded assets.
2026-10-07 20:03:18 +03:00
randogoth
d85427156e feat: add a Linux CI job alongside macOS, in one shared workflow
All checks were successful
CI / macos (push) Successful in 43s
CI / linux (push) Successful in 4m42s
Renamed macos.yml to ci.yml with two jobs (macos, linux) under one
push/PR/dispatch trigger, so both run from the same commit instead of
needing separate files. Cache keys are now OS-prefixed (cargo-macos-/
cargo-linux-): target/ artifacts are platform-specific and would
otherwise collide under a shared key.
2026-10-07 19:47:41 +03:00
randogoth
15fdbe4dbd chore: update devbox.lock for gtk4/libadwaita on Linux 2026-10-07 19:47:41 +03:00
randogoth
ba97f63841 feat: make devbox.json cross-platform for GTK4/libadwaita
Linux now gets gtk4/libadwaita declared as nix devbox packages (scoped
to linux platforms, with the dev output requested explicitly - nixpkgs
splits runtime libs from headers/pkgconfig, and devbox only installs
the default output unless told otherwise). macOS keeps using Homebrew's
build exactly as before (nixpkgs' GTK build is much rockier there).

PKG_CONFIG_PATH moved out of the static env block (which can't be
platform-conditional) into init_hook, which can branch on uname.
Verified building clean with 0 warnings on both this machine (Linux)
and apfel (macOS).
2026-10-07 19:45:20 +03:00
randogoth
2447e9bcb5 feat: cache cargo registry and target dirs keyed on Cargo.lock
All checks were successful
macOS / check (push) Successful in 48s
2026-10-07 15:30:17 +03:00
randogoth
648f041cf3 fix: pin fumi checkout to main, skipping a default-branch API lookup the carrier-scoped token can't make
All checks were successful
macOS / check (push) Successful in 38s
2026-10-07 13:46:37 +03:00
randogoth
5d68f3e245 feat: checkout fumi as a sibling dir in CI to match the local path dependency
Some checks failed
macOS / check (push) Failing after 43s
2026-10-07 13:45:14 +03:00
randogoth
69fd6d58e7 feat: clear the Forgejo-injected GITHUB_TOKEN before devbox run check
Some checks failed
macOS / check (push) Failing after 3s
2026-10-07 13:34:00 +03:00
randogoth
402e108634 feat: add macOS CI workflow targeting the Forgejo runner
Some checks failed
macOS / check (push) Failing after 3s
2026-10-07 13:11:09 +03:00
randogoth
cda8985218 feat: ask whether a reply carries the sender's frontmatter 2026-10-07 13:10:09 +03:00
randogoth
dacbc9de38 feat: show received frontmatter fields in the message detail 2026-10-07 13:10:09 +03:00
randogoth
68f5620d35 feat: let composes carry custom frontmatter headers 2026-10-07 13:10:09 +03:00
74ec9a2492 feat: simplify devbox config for macOS aarch64
On Apple Silicon Macs, many GTK-related nixpkgs packages are marked as
unsupported on aarch64-darwin. Instead of using nixpkgs for the GUI stack,
use Homebrew which provides pre-built bottles for gtk4, libadwaita, and
all their dependencies (glib, pango, cairo, gdk-pixbuf, graphene, etc.).

The devbox config now provides only the Rust toolchain (rustc, cargo,
pkg-config, rustfmt) and sets environment variables to locate the
Homebrew-installed libraries:
- PKG_CONFIG_PATH: /opt/homebrew/lib/pkgconfig
- PKG_CONFIG_PATH_arm64_apple_darwin: /opt/homebrew/lib/pkgconfig
- PATH: Includes /opt/homebrew/bin and /opt/homebrew/sbin

This allows building the project with: devbox run build
All 16 tests pass with: devbox run check

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-10-07 12:48:09 +03:00
randogoth
0b20b56cba feat: embed the carrier icon in the Windows exe 2026-10-03 14:01:10 +03:00
randogoth
65c0ad2c77 feat: add a one-command windows build script 2026-10-03 12:31:19 +03:00
randogoth
080b47b24f feat: package the app as a flatpak 2026-10-03 12:17:15 +03:00
randogoth
8e9d2a92a6 feat: make senders tappable and replace the toasts with a fixed status line 2026-10-03 11:22:35 +03:00
randogoth
22c20427f0 feat: unify the detail view with QR sharing and default pane layout 2026-10-03 11:03:21 +03:00
randogoth
84650e50bd feat: stash composes closed by sidebar trips as drafts 2026-10-03 09:46:55 +03:00
randogoth
f55821213d fix: drop the duplicate envelope from the empty article pane 2026-10-03 09:38:33 +03:00
randogoth
7fdcd0d811 refactor: migrate the UI to GTK4 with Relm4 and libadwaita 2026-10-03 00:40:53 +03:00
randogoth
517d938c46 feat: adopt a notational-velocity layout with larger text 2026-10-02 00:08:59 +03:00
randogoth
7ed2889966 feat: list the store live while a fetch runs 2026-10-02 00:02:36 +03:00
randogoth
50299547e5 chore: pin a linker in the devbox environment 2026-10-02 00:02:36 +03:00
randogoth
96f3748086 fix: handle operation results before the busy guard so they clear it 2026-10-01 23:45:24 +03:00
randogoth
e9e40bca36 feat: build carrier, a minimalist Iced smolmail client on fumi-core 2026-10-01 23:45:24 +03:00