I have a pager. I’ve had it for a while now, and it sat doing nothing useful for an embarrassingly long time — mostly because setting up the transmit side of things felt like a project I’d “get around to eventually”. Well, I eventually got around to it!
The setup I’ve ended up with is pretty simple at its core: a Raspberry Pi polls an email inbox every couple of minutes, and if there’s an unread email with a subject matching page:{username}, it transmits a low-power POCSAG message over the air to the pager. That’s basically it. Which doesn’t sound like much, but it means I can page myself (or anyone else with a pager and a username in the config) from pretty much anywhere I can send an email.
POCSAG, briefly
POCSAG (Post Office Code Standardization Advisory Group — yes, really) is the protocol used by a lot of pagers. It supports a few different bitrates (512, 1200 and 2400 bps), and messages can be either numeric (BCD) or alphanumeric (7-bit ASCII). Each pager has a unique address, and the protocol is designed such that a pager only needs to wake up occasionally to check if anything is being sent to it.
If you want a much more thorough dive into the protocol itself, this article covers it well (from the receiving side).
The transmit side: rpitx
The bit that makes this all possible without any additional hardware (beyond the Pi itself and a bit of wire for an antenna) is rpitx. It’s a tool that uses the Raspberry Pi’s GPIO pins to transmit RF directly — no SDR dongle, no upconverter, nothing. Just a Pi and a wire.
For POCSAG specifically, rpitx includes a pocsag binary that takes a capcode, a message, and a frequency, and just… sends it. Which is both impressive and slightly alarming.
(The obvious caveat: transmitting RF is regulated. rpitx is very low power, and I’m transmitting on a frequency I have appropriate authorisation for. Please don’t just aim rpitx at whatever frequency you fancy — do check the relevant regulations for your jurisdiction first.)
The polling script
The actual glue between email and radio is a Python script running on the Pi. Every couple of minutes (via a cron job, nothing fancy), it:
- Connects to the inbox via IMAP
- Fetches unread messages
- Checks if the subject matches
page:{username} - If it does, marks the email as read and fires off an
rpitx pocsagcommand with the appropriate capcode and the email body as the message
The usernames map to capcodes in a config file, not that anyone else is likely to be using this but it felt neater than hardcoding them in the script. The capcode is basically the pager’s address — it’s what tells the pager “hey, this message is for you”. The message itself is just the body of the email, which gets transmitted as an alphanumeric POCSAG message.
One thing worth noting: POCSAG messages are alphanumeric but the character set is limited to 7-bit ASCII, and in practice a lot of pagers have relatively short message length limits. I added a truncation step so long email bodies don’t cause anything to misbehave.
Does it work?
Yeah, actually! There’s something deeply satisfying about sending an email and having a physical pager go off a minute or so later. It’s not instant (the polling interval means there’s always some delay), but for the things I want to use it for — reminders, alerts, that sort of thing — it’s more than fast enough.
It’s also genuinely useful as a notification channel that’s separate from my phone. The pager doesn’t need wifi, doesn’t need a data connection, and the battery lasts ages. If the internet is down but the Pi is still up and I can still send email via another route, I can still receive pages. Which is probably overkill for home use, but I like it.
I might tidy up the code and put it somewhere public at some point, but for now it’s living in a slightly chaotic git repo.