Desktop and Mobile view of the PagerMon interface
This repository contains both the PagerMon Server and the PagerMon Client, providing a complete solution for receiving, processing, and displaying paging messages (POCSAG/FLEX).
server/: The Node.js based backend and web interface.client/: The client application (usually running on a Raspberry Pi or similar) that receives data from hardware and pushes it to the server.
The server is responsible for storing messages in a database, providing a real-time web interface, and handling integrations via plugins (Webhooks, MQTT, Pushover, etc.).
- Node.js (v18+ recommended)
- SQLite (default) or MySQL/MariaDB
- Navigate to the server directory:
cd server - Install dependencies:
npm install - Use default config as base:
cp config/default.json config/config.json - Start the server:
npm start(or use PM2, see below)
- Real-time Web UI: View incoming messages as they arrive.
- Advanced Filtering: Hide or highlight messages based on regex or capcodes.
- Webhook Integration: Send messages to Home Assistant, Node-RED, or custom endpoints.
- Plugin System: Support for Discord, Telegram, Slack, Pushover, and more.
The client captures raw paging data (e.g., from Multimon-NG or PDW) and sends it to the server's API.
- Node.js
- Hardware receiver (SDR Dongle or similar)
- Navigate to the client directory:
cd client - Install dependencies:
npm install - Configure the client:
cp config/config.json.example config/config.json - Edit
config/config.json:- Set
hostnameto your server address (default ishttp://localhost:3000for local setups). - Set the
apikeyas defined in your Server settings.
- Set
Run the reader script:
./reader.shThis repository is configured with .gitignore to prevent sensitive information from being committed.
- Database: Local SQLite files (
messages.db) are excluded. - Configuration:
config.jsonfiles are excluded. Always use the provided.exampleordefault.jsonfiles as a base for your local setup. - Sessions: User sessions and PIDs are excluded.
PM2 is a process manager that ensures PagerMon starts automatically when your computer/Pi boots and restarts if it crashes.
sudo npm install -g pm2Go to the server directory and start it:
cd server
pm2 start app.js --name "pagermon-server"Go to the client directory and start the monitoring script:
cd client
pm2 start reader_monitoring.sh --name "pagermon-client"To make sure everything starts after a reboot:
pm2 save
pm2 startup(Follow the instructions on your screen after running pm2 startup).
PagerMon supports sending data via Webhooks. The standard output format is:
{
"address": "1234567",
"message": "Alarm message text",
"source": "SDR-01",
"timestamp": 1715158800,
"alias": "Fire Dept",
"agency": "Fire"
}Yes! On the first start, the server will create a messages.db SQLite file (if using SQLite) and run all necessary migrations to set up the tables. You don't need to provide a blank database.
- Check your
apikeyinclient/config/config.json. It must match one of the keys in the Server Admin -> Settings -> API Keys. - Ensure the
hostnamein the client config points to your server (e.g.,http://localhost:3000). - Check the console output of the client for "401 Unauthorized" (wrong key) or "ECONNREFUSED" (server not reachable).
Some scripts (like reader_monitoring.sh or pagermon.config.js) might contain specific paths for the original developer's environment (e.g., /home/pi/). Make sure to check these scripts and update the paths to match your installation directory.
- Never commit your
config.jsonto a public repository. - The
.gitignorefile is pre-configured to exclude databases and sensitive configurations. - Default admin password is set via
config/default.json. Change it immediately after login.
This project is a fork and consolidation of the original PagerMon project. We would like to extend a huge thank you to the original PagerMon creators and contributors (Dave McKenzie and many others) for their incredible work in building the foundation of this paging solution.
This version has been enhanced with:
- Alpine.js frontend modernization.
- FLEX Group Calling optimizations for the Dutch P2000 network.
- Consolidated Client & Server repository structure.
