diff --git a/Cargo.lock b/Cargo.lock
index c066ee3..afbbcc1 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -116,7 +116,7 @@ dependencies = [
[[package]]
name = "carrier"
-version = "0.3.0"
+version = "0.3.1"
dependencies = [
"fluent-bundle",
"fumi-core",
@@ -430,7 +430,7 @@ dependencies = [
[[package]]
name = "fumi-core"
-version = "0.1.0"
+version = "0.1.1"
dependencies = [
"chacha20poly1305",
"data-encoding",
diff --git a/Cargo.toml b/Cargo.toml
index ba38e7e..b124695 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "carrier"
-version = "0.3.0"
+version = "0.3.1"
edition = "2021"
description = "A minimalist smolmail client built on fumi-core, with a Relm4 UI"
license = "Apache-2.0"
diff --git a/data/com.randogoth.carrier.metainfo.xml b/data/com.randogoth.carrier.metainfo.xml
index 80ce224..e8a4fa9 100644
--- a/data/com.randogoth.carrier.metainfo.xml
+++ b/data/com.randogoth.carrier.metainfo.xml
@@ -14,6 +14,7 @@
com.randogoth.carrier.desktop
+
diff --git a/src/ops.rs b/src/ops.rs
index 8d3444f..103bce0 100644
--- a/src/ops.rs
+++ b/src/ops.rs
@@ -716,7 +716,14 @@ pub fn send(
.collect();
let draft = client::SendDraft {
address: &addr,
- text: body.to_string(),
+ // Trimmed at the send site, before the payload is signed, so the
+ // signature covers exactly the text the author meant. A compose buffer
+ // ends with whatever the author last pressed, and a trailing newline
+ // is not content — but it is content once it has been signed, and
+ // nothing downstream can remove it without invalidating the
+ // signature. smolboid, for one, refuses a post whose text carries a
+ // line break, because a published record is one line of a feed.
+ text: body.trim().to_string(),
subject,
reply_to,
headers: &owned,