Repository navigation
POCSAG Pager Monitor
The populated pictures and test results below document an earlier controlled test. Current empty-state device captures appear at the end and are indexed in Screenshot Catalog. Session messages remain RAM-only.
Status: verified in a controlled in-house test. OrcSDR Tab5 decodes the tested POCSAG 1200 transmission at 433.920 MHz. Field reception depends on local paging systems, modulation, signal quality, and applicable regulations.
Choose a frequency and baud rate appropriate to a local, authorized signal, attach a suitable antenna, and watch Signal before expecting messages on Live. The controlled test pictured below is historical; current empty screenshots do not demonstrate a fresh decode.
The monitor keeps the receiver state, newest message, recent-session inbox, and FEC health visible together. The message list and CAPCODE directory are local to the Tab5. The Session tab intentionally states when no messages are retained: session messages are RAM-only and clear on restart.

The newest-message card identifies the CAPCODE, POCSAG function, message type,
baud rate, decode quality, and receive age. The inbox keeps recent messages in
arrival order. The button states SCAN n FREQS before discovery starts, so the
operator can see the active profile size. It becomes Stop Scan while
discovery is active.
The Live screen is built to discover POCSAG frequencies. During a scan it shows
SCANNING POCSAG FREQUENCIES, the exact candidate frequency, CHANNEL n OF n,
and measured progress. OrcSDR dwells four seconds per candidate and tunes to a
winner only after observing BCH-valid paging data. A corrected-only result is
reported as weak evidence rather than a confirmed channel.
The frequency database is the SD-card file /orcsdr/pocsag_scan.cfg: one Hz
frequency per non-comment line. It is intentionally user-editable so a device
can use a regional or national profile anywhere in the world. OrcSDR does not
ship a Lane County list. If no usable file is present, it uses a small generic
US paging seed as a starting point; it is not a global frequency claim and it
does not imply that every listed channel carries POCSAG.
# Profile: region or service area
# Source: public licensing record, monitoring notes, or operator authorization
# Reviewed: YYYY-MM-DD
433920000
Maintain profile files by region on a computer, retain the source and review date for each candidate, and copy the chosen profile to the SD card before scanning. The CAPCODE directory is a separate local database, populated only by pages the Tab5 has decoded; it does not identify a transmitter by frequency.

The directory is built from CAPCODEs observed by the current session. Selecting an ID shows its hit count, group, last-seen time, and most recent retained message. Alias and group editing remain follow-up work.

Signal view exposes the measured decoder state: lock, detected baud, polarity, FSK deviation, sync losses, codeword outcomes, recent soft decisions, and FEC history. The two buttons cycle the receiver's Baud and Polarity controls; a change resets decoding briefly while it resynchronizes.

The Session view provides a selectable recent-message list and full retained message detail. This capture was taken immediately after a reboot and correctly shows the empty state; it is not a claim that the verified message history is persistent.
The test used an in-house OrcPager quick app on a M5Stack Cardputer ADV. Its CC1101 transmitted a POCSAG alpha page with these fixed test settings:
| Setting | Value |
|---|---|
| Frequency | 433.920 MHz |
| Baud rate | 1200 |
| Power | -30 dBm configured |
| CAPCODE | 1234560 |
| Text | TEST |
| Repeats | 3 per trigger |
The same transmissions were independently received and decoded on a Flipper Zero using the POCSAG_Pager application. That gave us an independent receiver-side check that the test signal was valid before diagnosing the Tab5 path.
On the Tab5, after the receiver fix, serial telemetry reported POCSAG 1200,
inverted polarity, 14 decoded messages, 224 valid codewords, no corrected or
uncorrectable codewords, and zero USB or application IQ drops. The operator
also confirmed 1234560 and TEST in the Tab5 message list.
The clean dashboard captures above are from a later fresh-boot run of the same
three-repeat test: three displayed TEST messages, 48 valid codewords, and no
corrected or uncorrectable codewords.
The initial implementation could render RF activity but still miss pager messages. Capture and replay isolated three contributing issues:
- full-rate double-precision DSP work caused application IQ blocks to drop;
- the measured transmitter tones were displaced from the receiver LO, so the old discriminator rate could wrap their phase;
- symbol phase tracking mixed adjacent symbols around transitions.
The decoder now uses bounded single-precision boxcar sums, discriminates before the final reduction to 38.4 kS/s, centers carrier offset, and makes one-sample symbol-boundary corrections. The host test suite covers both polarities, arbitrary phase, ±6 kHz and ±13.5 kHz offsets, and ±1% symbol clock error.
This implementation was developed independently. The Flipper project was read only to compare observable protocol behavior and test parameters; no Flipper code was copied or redistributed.
The source tests, firmware build, app-only flash, serial counters, and on-screen message confirmation are separate evidence:
-
tools/test-pocsag-core.ps1passed optimized and ASan/LSan/UBSan runs. -
tools/test-pocsag-store.ps1andtools/test-radio-scan.shpassed. - The native ESP-IDF build passed.
- The app image was flashed only at
0x10000; the transfer reported a verified data hash. Bootloader, partitions, and NVS were not rewritten. - The final UI image SHA-256 is
9d081e6c935e130aa0f26becf21357e529cee2a69a9147af13c28bc0bb7918cc.
This is a successful test of the stated 433.920 MHz / 1200 baud setup. It does not establish sensitivity, long-term reliability, or live 512/2400 baud acceptance.
These are actual 1280 × 720 Tab5 captures from 29 September 2026, using PNG-capable source 897c60a. They show the interface, not proof of reception. Live and demo refer to capture mode; the source is newer than the published release binary. See Screenshot Catalog for file hashes and provenance.
These current empty-state captures differ from the older controlled-transmission pictures above.





PR #63: offset-signal decoding and monitor records the implementation. The controlled 1200-baud result below is a specific test, not broad field acceptance. The published release identifies the installed package. A merged PR or source test alone does not establish live reception on every setup. Screenshots from the later capture build are identified in Screenshot Catalog.