XPRS
Every message you send today goes through somebody's tower, somebody's server and somebody's account. When one of them is down, busy or switched off, the message does not go.
XPRS carries small text messages over whatever is to hand: Bluetooth, LoRa, WiFi, amateur radio, or the internet when there is one. When none of it is there, the messages still move, passed from device to device by whoever hears them. Nothing to sign up for, and no service in the middle that can refuse.
Why you would use it
- A power cut, a storm, a jammed network, a boat, a valley with no coverage: if someone is in range, you can reach them.
- There is no server to seize, no account to suspend and no bill. The network is whoever is running it.
- Your key is made on your device. Nobody issues it and nobody can revoke it, and messages are signed with it, so a name on the air can be checked rather than trusted.
- It runs on the Bluetooth in your phone, a twenty-euro LoRa board, an old handheld, the WiFi in the room, or the internet when there is one.
- The format is plain text you can print and read: no binary encoding, nothing to reverse engineer.
- Fields a device does not know are skipped rather than rejected, so an old device keeps working with a new one.
What a message looks like
At most 250 bytes, so it fits one cheap radio transmission:
A message to a friend:
t:message f:X1QZ3N d:X1RD89 ts:2026-08-18_09:15:00 m:arrived at the marina, see you at the cafe
A call for help, relayed further than anything else:
t:sos f:X1QZ3N pos:38.7223,-9.1393 kind:medical ts:2026-08-18_09:20:00 m:broken leg, cannot walk
The same messages travel LoRa, Bluetooth, WiFi, ham radio bands, wired networks and the internet, unchanged. And because it is a flat list of names and values, it is already JSON if your program prefers that:
{"t":"message","f":"X1QZ3N","d":"X1RD89",
"ts":"2026-08-18_09:15:00","m":"arrived at the marina"}
Values stay text, because the unit is part of the value -
temp:14.2C is "14.2C", never 14.2.
Section
4.10 has the conversion both ways.
Private messages
You can send a message that only the person it is addressed to can read. Everyone else sees that a message went from someone to someone, and when - but not a word of what it says:
t:message f:X1QZ3N d:X1RD89 ts:2026-08-08_14:26:40 x:pQ4m9xT2vB8kR sig:<60 characters>
Sender, recipient and time stay in the open on purpose: a relay needs them to pass the message along, or to hold it until the recipient is back in range. It never needs the content.
What a device can be
There are six jobs on the network, and one device can do any of them. Yours probably does two or three without you thinking about it:
- a station is you - sending and receiving your own messages
- a relay repeats what it hears, so a message travels further than one radio reaches
- a carrier holds a message for someone out of range and hands it over when they come back, against a signed receipt
- a gateway passes traffic between radio and something that is not XPRS - the internet, or APRS
- a file server keeps files and hands out any piece of one to whoever asks for it
- an archiver keeps what it heard and answers for it later: the traffic, the posts of people who chose it, and mail waiting for someone who is away
Nobody assigns these. You pick which ones your device takes on, how much of your battery and storage they get, and you can stop at any time. Every station is already a small archiver of its own record; saying so out loud is what offers it to everyone else.
If you already use APRS
XPRS is APRS carried forward. The idea is unchanged - small text packets, heard by anyone, repeated by volunteers.
- Identity is proven. Packets are signed with a key the station holds, and a licensed callsign can be bound to that key.
- Delivery is tracked. Stations hold mail for operators who are away, and hand it over against a signed receipt - so you can ask for what you missed instead of losing it.
- No central server. APRS routes through one internet backbone. In XPRS each station picks its own archives, and they exchange directories instead of copying each other's traffic.
- Files and privacy. Neither existed before: whole files move over the air, and messages can be sealed off it.
Do you need a licence?
Not for most of it. LoRa and Bluetooth in the ISM bands, WiFi and the internet are licence-free, and your identity is a key your device makes - nothing to register, nobody to ask.
On amateur bands the amateur rules apply as always: plain text, your government-issued callsign, no encryption. XPRS respects that line rather than blurring it - sealed messages and self-made callsigns never go onto amateur spectrum.
Download
The current release, straight from GitHub. These links always point at the newest one:
The application's own page has every file of this release with its sha256, the other Android processors, and what each platform needs to install it. Every version ever released is on the releases page. Windows and Linux are unsigned, so both will warn you on first run.
Running it
- The application for phones and desktops. Released for Android, Linux and Windows. The source is in xprs-dev/app.
- The firmware in C, it turns a cheap board into a station, repeater and mailbox: T-Dongle-S3, M5Stack Core, Heltec LoRa, kv4p, SenseCAP P1-Pro and others. The source is in xprs-dev/firmware.
- xprs-dev/reticulum-dart the shared networking library: mesh transport, a DHT, file sharing and the signature scheme.
- The apps the small applications that run inside the application, with the catalog it installs them from. The source is in xprs-dev/apps.
Writing your own
The format is small, and fully specified.
- XPRS.md
the specification, edition XPRS-2026. Every section links on its own, as
/spec/#3-callsigns. The Markdown source is in xprs-dev/spec. - xprs_corpus.json the conformance corpus: every example in the document with its byte count and identifier. Replay them exactly to check an implementation.
- github.com/xprs-dev/spec the specification repository
Taking part
- github.com/xprs-dev the XPRS organization on GitHub
- Discussions questions, feedback and proposals about the format go here
Credits
XPRS is built on work that came before it, and most of what makes it possible was designed by other people.
- Reticulum - Mark Qvist the cryptography-first networking stack XPRS uses to cross the mesh and the internet.
- NOSTR - fiatjaf the event and relay model, and the keypair a station's identity is built on.
- APRS - Bob Bruninga, WB4APR (SK) the original: small text packets, heard by anyone, repeated by volunteers. Begun in 1982. XPRS continues it.
- APRS-IS - Steve Dimse, K4HG, and the team that followed APRServe, the first APRS-IS server, in 1997, and the servers and operators that have carried APRS across the internet ever since.
- XPRS - Max Brito the founding implementation: the specification, the codecs, and the applications that speak it.