Open Free and open source, read the code Get it Donate App help Contact
Messenger
The app
Developers
Project
Legal

A flamenet.io account is not a Flamenet Messenger account. The two sign-ins are separate.

What's new

Every release of the apps and the relay, newest first. Written for people using Flamenet Messenger; the parts that only matter if you run your own relay are at the bottom of each release.

2026-09-15

iPhone beta 0.23.0

The first call rings a locked phone, and a call keeps talking when the screen locks.

  • Fixed, The first call to a phone that was not already running never reached the lock screen; the second one did. Two pieces of work that had to happen the moment the call arrived were queued behind the app's own launch instead. They run inline now. A simulator cannot receive the push that starts this, so the proof is a locked phone that rings.
  • Fixed, Locking the phone, or switching apps, during a call let the far end hear silence while both screens said the call was up. The app now keeps its audio running in the background for the length of the call.
  • Changed, App Diagnostics, under Account. iOS records a report when the app crashes or freezes, and the app keeps the last few on the phone so there is something to send if you ever want to. Nothing is uploaded, not behind a setting and not on a timer. Sending one is something you do.
  • Changed, Privacy Policy and Terms of Use, under Account. They open the pages the server you are signed in to serves, so on somebody else's server you read their policy, not ours.
  • Changed, Two dozen slash commands from when the messenger lived inside a website, /search, /video, /forum and the rest, are gone. They called routes the server never had and answered with an error after a round trip. Status, presence, buddies, blocking, whois, star and archive stay.
  • Changed, If the people who run your server suspend your account, the app now shows you their sentence saying so, rather than a generic refusal that reads like a broken install.

2026-09-14

relay

A report reaches a person.

  • Fixed, Reporting something wrote a row to the server's database and did nothing else. No mail, no alert, and nothing anybody could read the table back with, while the safety page had been saying for months that a report goes to the people who run this server. It went to their disk. It now reaches them. If mail happens to be down the report is still filed, because turning away a report because a mail server is unwell would lose the one copy of something somebody went out of their way to send.
  • Changed, A report can carry a copy of what is being reported, which makes it the most sensitive thing this server holds, and it was the only thing here with no expiry at all. Reports are now deleted after a year.
  • Changed, The server keeps a note of what became of each attempt to ring a phone, so that a phone nobody can ring is something the people running it can see rather than something you have to report. It records that an attempt was made and what the push service said, against an envelope whose recipient and time are already stored, and it is deleted after seven days.

If you run your own relay

  • FN_REPORTS_TO is the address reports are mailed to. With nothing set, the relay logs that a report was filed with nowhere to send it instead of filing in silence, which is the state every deployment has been in until now. Scripts/reports.sh reads the table back and leads with accounts more than one person has reported.
  • If you run this relay on SQLite, take this build. The TuneUserDataAutovacuum migration checked that the database was SQL rather than that it was Postgres, so it passed on SQLite and then fed it a DO block, which SQLite has no such statement for. A migration that throws takes the process down at boot. Every SQLite-backed node in our own fleet crash-looped for forty minutes while the Postgres node beside them stayed healthy and the deploy gate read that one node and reported the fleet fine. The guard is now the dialect, on both prepare and revert.
  • ring_events is a new table: one row per attempt to ring a phone, holding the outcome only. Swept after seven days. Scripts/call-health.sh reads it back alongside how long a rung phone took to collect the call, which is the number that tells a slow client from a silent one.
  • FN_REPORT_RETENTION_DAYS defaults to 365. Ring events are fixed at seven days and are not configurable.
  • The monitoring script warns at 80 per cent on open file descriptors, Postgres connections, TURN relay ports and disk. It previously reported only whether things were alive, which says nothing until the moment they are not.

2026-09-14

android 0.22

The same build as 0.21, under the number this page and the app both show.

  • Changed, Nothing here behaves differently from 0.21. This release exists so that the version on this page, the version the app shows you and the file you download are all the same number. If you are already on 0.21 there is nothing you need to do.

2026-09-14

android 0.21

An answer no longer waits twenty seconds to arrive.

  • Fixed, Calling an iPhone took far longer than it should. While the app is on screen it does its own collecting, and it was still asking the server to hold each request open for twenty seconds, including during a call. So the other person answered, their answer sat on the server, and this end did not ask for it until the hold ran out. Measured against a real pair of phones: this app took an average of 112 seconds to collect what was waiting for it, where an iPhone took 5. During a call it now asks once a second and takes whatever is there.
  • Changed, The version you see here and the version the app shows now match. The number underneath, which only decides which build is newer, had run ahead of the name.

2026-09-14

android 0.19

Calls end when somebody ends them, and a report in a group actually sends.

  • Fixed, An answer could be thrown away. Two loops watch your mailbox, one while the app is on screen and one while it is not, and whichever asks first gets the message. The second one knew what to do with a ringing call and a hang-up and quietly discarded everything else, so an answer it happened to pick up was lost and the person calling sat on Calling for forty-five seconds before giving up. Whichever loop receives a call signal now hands it to the call.
  • Fixed, An answer took twenty seconds to arrive. While a call is being set up the app asked the server to hold its request open for twenty seconds at a time, which is right for messages and wrong for the two things somebody is watching a screen for. Measured on a real pair of phones: a call offered at one second past and answered at nine seconds past, and the answer reaching the caller twenty-one seconds later. It now asks once a second for the length of a call, and the same pair measures under three.
  • Fixed, Being called while you were already ringing answered the caller busy. The same message can reach you twice, and the second copy was mistaken for a second caller: your phone told the person calling that you were busy while it was ringing at you about them. Every message now carries an identifier so a repeat is recognised as a repeat, which also stops duplicates in conversations and in the call log.
  • Fixed, Reporting somebody in a group sent nothing at all. You could choose a reason and press send and the form would close, having sent nothing and said nothing. It reports whoever wrote the message now, and Block in the same place blocks them rather than doing nothing.
  • Changed, Report and Block are in the conversation menu, at the top. Reporting used to be reachable only by pressing and holding a message, and blocking only from the banner shown for somebody who is not yet a contact, so once you had kept somebody there was no way to block them from the conversation at all.
  • Changed, Closing the app during a call ends it for the other person too, rather than leaving them talking to a call that is already over.
Free and open source · No ads · No phone number · Your own server if you want one