Android 0.9: the release notes, the download page, and two more cards

🔴 **Written from the commits between 62a8206 and the build, not from
memory.** 62a8206 is the commit that published 0.8, so everything listed
here is something a person on 0.8 does not have and will get. The two new
cards on the Messages page — editing and search — were held back
deliberately until this build; they were true of `main` and of nothing
anybody could install.

⚠️ The operator note about `content_reports` is the important one. A
report carries the reporter's own decrypted copy, so turning moderation
on gives a self-hoster the one table on the server holding readable user
content. Somebody running this for their friends should learn that from
the release notes rather than from the schema.

The version on /get still comes from downloads/android-latest.json rather
than from this file. Only the "installed an earlier build?" line names a
number, and it now names the thing worth reinstalling for.
This commit is contained in:
Paul Hitt
2026-09-05 11:58:55 -04:00
parent fe0ffd23ce
commit ee969a21d3
3 changed files with 99 additions and 4 deletions
+5 -4
View File
@@ -62,10 +62,11 @@
something and chosen a password is a worse way to learn it.
</p>
<p class="fineprint">
<strong>Installed an earlier build? Replace it.</strong> Version 0.8 fixes
two problems in it &mdash; answering a call could close the app, and
messages sent from Android did not always arrive. Installing over the top
keeps your account and your conversations.
<strong>Installed an earlier build? Replace it.</strong> Version 0.9
brings editing, search, forwarding and pinning, and fixes an
&ldquo;unsend&rdquo; that did not unsend &mdash; it cleared the message
from your phone and left it on theirs. Installing over the top keeps your
account and your conversations. <a href="/releases">What changed</a>.
</p>
<p class="fineprint">
<!-- Said before somebody waits for something they cannot install. The
+18
View File
@@ -80,6 +80,24 @@
it. There's no way to wave it away, because there shouldn't be.
</p>
</article>
<article class="card">
<span class="card-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M4 20h4l10-10a2.8 2.8 0 0 0-4-4L4 16z"/><path d="M13.5 6.5l4 4"/></svg></span>
<h3>Fix the typo</h3>
<p>
Change a message after you've sent it. It turns up on the other phone
as the same message, marked edited — not as a second one nobody can
tell apart from the first.
</p>
</article>
<article class="card">
<span class="card-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="6"/><path d="M20 20l-4.5-4.5"/></svg></span>
<h3>Find what you said</h3>
<p>
Search across every conversation you have. It happens on your phone,
because the server has never been able to read a word of it — which
is also why nobody can search it but you.
</p>
</article>
<article class="card">
<span class="card-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="16" rx="2"/><path d="M8 3v4M16 3v4M3 10h18"/><path d="M12 14v3l2 1"/></svg></span>
<h3>Write now, send later</h3>
+76
View File
@@ -1,4 +1,80 @@
[
{
"date": "2026-09-05",
"platforms": [
{
"name": "android",
"version": "0.9"
}
],
"headline": "The things you kept reaching for and couldn't find.",
"changes": [
{
"kind": "new",
"text": "Change a message after you've sent it. It arrives on the other phone as the same message, marked edited — not as a second one nobody can tell apart from the first."
},
{
"kind": "new",
"text": "Search everything you've ever said, across every conversation. It happens on your phone, because the server has never been able to read a word of it and still can't."
},
{
"kind": "new",
"text": "Forward a message on, pin the ones worth keeping at the top of a conversation, and react to one without writing a reply."
},
{
"kind": "new",
"text": "Put a timer on a single message instead of the whole conversation. If somebody screenshots one of those, you'll be told."
},
{
"kind": "new",
"text": "Stories grew up: several pictures as one sequence, a story just for a group, replies, and mentioning someone by name. Your own posts are kept in a private archive so you can save one before it goes."
},
{
"kind": "new",
"text": "Report or block someone from a story. A report goes to whoever runs your server, and the app tells you plainly that your copy of what you're reporting travels with it — there's no way for the server to look at it otherwise."
},
{
"kind": "new",
"text": "Files and Wallet are on the phone now. Your vault opens with the Flamenet passphrase you already have, and you can send a file straight into a chat with the label it carries."
},
{
"kind": "new",
"text": "A half-written message is still there when you come back to it."
},
{
"kind": "fixed",
"text": "\"Unsend\" did not unsend. It removed the message from your phone and left it on theirs, while the word promised otherwise. The button now says what it does."
},
{
"kind": "fixed",
"text": "A message that expired took its words with it and left the picture or the voice note sitting on the phone."
},
{
"kind": "fixed",
"text": "A call that was refused because the other person's key had changed just failed. It now says that's why, which is the one case where it matters."
},
{
"kind": "fixed",
"text": "Files asked you to invent a second secret it never needed. It asks for your Flamenet passphrase."
},
{
"kind": "fixed",
"text": "A contact with no address was listed as the word \"null\", and a link saved to the vault looked like it had done nothing at all."
},
{
"kind": "changed",
"text": "The app checks the server's identity itself rather than trusting the certificate alone, forgets key material the moment it's finished with it, and keeps count of every message that had to travel the less private way — with a switch to refuse those instead."
},
{
"kind": "changed",
"text": "Guessing at the app lock gets slower the more you get it wrong."
}
],
"selfHosting": [
"Story and message reports land in a new content_reports table, and a report carries the reporter's own decrypted copy of what they are reporting. That is the one place readable user content exists on the server, it is there because somebody chose to put it there, and no route reads it back — you read it out of band. Plan for it before you turn moderation on, and treat that table as you would any other sensitive record.",
"Nothing else here needs anything from an operator. Clients update themselves from downloads/android-latest.json as usual."
]
},
{
"date": "2026-09-05",
"platforms": [