{"id":13596372,"url":"https://github.com/pagermon/pagermon","last_synced_at":"2025-05-16T03:07:13.818Z","repository":{"id":21627078,"uuid":"93454250","full_name":"pagermon/pagermon","owner":"pagermon","description":"Multimon-ng pager message parser and viewer","archived":false,"fork":false,"pushed_at":"2025-04-27T15:58:45.000Z","size":5115,"stargazers_count":279,"open_issues_count":102,"forks_count":81,"subscribers_count":36,"default_branch":"master","last_synced_at":"2025-05-13T10:55:05.230Z","etag":null,"topics":["angularjs","hacktoberfest","javascript","multimon","nodejs","pager","pocsag","radio","sdr","software-defined-radio"],"latest_commit_sha":null,"homepage":"https://hrng.io/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pagermon.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-06-05T22:56:11.000Z","updated_at":"2025-05-09T14:45:16.000Z","dependencies_parsed_at":"2024-03-15T08:33:12.045Z","dependency_job_id":"0b1c6734-c7e0-44eb-8048-d5e3d1eeedd3","html_url":"https://github.com/pagermon/pagermon","commit_stats":{"total_commits":1039,"total_committers":32,"mean_commits":32.46875,"dds":0.6284889316650626,"last_synced_commit":"80197e7626a71df2687ab73d735ec9ab57b5e214"},"previous_names":[],"tags_count":37,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pagermon%2Fpagermon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pagermon%2Fpagermon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pagermon%2Fpagermon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pagermon%2Fpagermon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pagermon","download_url":"https://codeload.github.com/pagermon/pagermon/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254459088,"owners_count":22074605,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["angularjs","hacktoberfest","javascript","multimon","nodejs","pager","pocsag","radio","sdr","software-defined-radio"],"created_at":"2024-08-01T16:02:22.182Z","updated_at":"2025-05-16T03:07:08.808Z","avatar_url":"https://github.com/pagermon.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# [PagerMon](https://hrng.io/)\n![Discord](https://img.shields.io/discord/533900375066017812.svg?style=plastic)\n![GitHub issues](https://img.shields.io/github/issues-raw/pagermon/pagermon.svg?style=plastic)\n![GitHub pull requests](https://img.shields.io/github/issues-pr/pagermon/pagermon.svg?style=plastic)\n![GitHub](https://img.shields.io/github/license/pagermon/pagermon.svg?style=plastic)\n![GitHub stars](https://img.shields.io/github/stars/pagermon/pagermon.svg?style=plastic)\n![GitHub forks](https://img.shields.io/github/forks/pagermon/pagermon.svg?style=plastic)\n![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/pagermon/pagermon.svg?label=release\u0026style=plastic)\n![GitHub commit activity](https://img.shields.io/github/commit-activity/m/pagermon/pagermon.svg?style=plastic)\n![GitHub contributors](https://img.shields.io/github/contributors/pagermon/pagermon.svg?style=plastic)\n![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/pagermon/pagermon/server.js.yml?branch=master\u0026label=Build%20master)\n![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/pagermon/pagermon/server.js.yml?branch=develop\u0026label=Build%20develop)\n\nPagerMon is an API driven client/server framework for parsing and displaying pager messages from multimon-ng.\n\nIt is built around POCSAG messages, but should easily support other message types as required.\n\nThe UI is built around a Node/Express/Angular/Bootstrap stack, while the client scripts are Node scripts that receive piped input.\n\n## Features\n\n* Capcode aliasing with colors and [FontAwesome](https://fontawesome.io/icons/) icons\n* API driven extensible architecture\n* Multi-user support\n* SQLite or MySQL database backing\n* Configurable via UI\n* Pagination and searching\n* Filtering by capcode or agency\n* Duplicate message filtering\n* Native POCSAG / FLEX / EAS Client Support\n* Keyword highlighting\n* WebSockets support - messages are delivered to clients in near realtime\n* Pretty HTML5\n* Native browser notifications\n* Plugin Support - Current Plugins:\n    * [Pushover](https://pushover.net/) near realtime muti-device notification service\n    * [Prowl](https://prowlapp.com) near realtime iOS notification service with Apple Watch support\n    * [Telegram](https://telegram.org/) near realtime cloud based multi-device messaging\n    * [Discord](https://discordapp.com/) near realtime cloud based messaging service\n    * [Gotify](https://gotify.net/) Self-Hosted messaging service\n    * [Twitter](https://www.twitter.com/)\n    * [Microsoft Teams](https://products.office.com/en-us/microsoft-teams/group-chat-software) Team colaboration platform\n    * [Slack](https://slack.com/) Team colabortation platform\n    * SMTP Email Support for conventional SMTP email notifications \n    * Regex Filters - Filter incoming messages via regex\n    * Regex Replace - Modify incoming messages via regex\n    * Message Repeat - Repeat incoming messages to another pagermon server\n* May or may not contain cute puppies\n\n### Planned Features\n\n* Horizontal scaling\n* Enhanced message filtering\n* Bootstrap 4 + Angular 2 support\n* Enhanced alias control\n* Graphing\n\n### Screenshots\n\n![main view](http://i.imgur.com/QWKoJjb.jpeg)\n\n![desktop view](http://i.imgur.com/Zik74Dl.jpeg)\n\n![alias edit](http://i.imgur.com/gus8QTe.jpeg)\n\n## Getting Started\n\nThese instructions will get you a copy of the project up and running on your local machine for development and testing purposes.\n\n### Prerequisites\n\n* [nodejs](https://nodejs.org/) 12.x or higher\n* sqlite3\n* Probably some other stuff\n\n#### Recommended\n\n* [nvm](https://github.com/creationix/nvm#installation)\n* nginx or some kind of reverse proxy for SSL offloading\n\n## Running the server\n\n### Local setup\n\n1) Copy server/process-default.json to server/process.json and modify according to your environment\n2) Launch the app from the Terminal:\n\n```\n    $ sudo apt-get install npm sqlite3\n    $ npm install npm@latest -g\n    $ npm install pm2 -g\n    $ cd server\n    $ npm install\n    $ export NODE_ENV=production\n    $ pm2 start process.json\n```\n3) To start on boot, let pm2 handle it:\n```\n    $ sudo pm2 startup\n    $ pm2 save\n```\n4) You probably want to rotate logs, too:\n```\n    $ pm2 install pm2-logrotate\n    $ sudo pm2 logrotate -u user\n```\n5) Now login via the website, default port is 3000, default credentials are 'admin' / 'changeme'\n6) Head to /admin, change your password, and generate some API keys\n6) Grab your API keys and drop them in the PagerMon client, then you're good to go!\n\nAlternatively a production ready setup guide is available here\nhttps://github.com/pagermon/pagermon/wiki/Tutorial---Production-Ready-Ubuntu,-PM2,-Nginx-Reverse-Proxy,-Let's-Encrypt-SSL,-Pagermon-server\n\n### Docker\n\n#### Manual build\n\nYou can use image already built for you or you can build it yourself:\n\n``` bash\n# For PC\ndocker build -t pagermon/pagermon .\n\n# For Raspberry Pi\ndocker build -t pagermon/pagermon:latest-armhf -f Dockerfile.armhf .\n```\n\n#### Running\n\n``` bash\ndocker create \\\n  --name=pagermon \\\n  -e APP_NAME=pagermon \\\n  -p 3000:3000 \\\n  -e TZ=Europe/London \\\n  -v \u003c/path/to/config-mount\u003e:/config \\\n  --restart unless-stopped \\\n  pagermon/pagermon:\u003cVERSION\u003e\ndocker start pagermon\n```\n\n### docker-compose\n\n``` yaml\nversion: \"2\"\nservices:\n  pagermon:\n    #build: ./server # To build localy\n    image: pagermon/pagermon:\u003cVERSION\u003e\n    container_name: pagermon\n    environment:\n      - APP_NAME=pagermon\n      - PUID=1000 # Not required since node user inside docker has UID 1000\n      - PGID=1000 # Not required since node user inside docker has GID 1000\n      - TZ=Europe/London\n    ports:\n      - \"3000:3000\"\n    volumes:\n      - \u003c/path/to/config-mount\u003e:/config\n    restart: unless-stopped\n```\n\nThen run:\n\n``` bash\n# Building with compose file\ndocker-compose build\n\n# Running from compose file in foreground\ndocker-compose up\n\n# Running from compose file in background\ndocker-compose up -d\n```\n\n#### Parameters\n\n|Parameter|Function|\n|:-------:|:-------|\n| `-e APP_NAME=\u003cname\u003e` | Application name |\n| `-e HOSTNAME=\u003chostname\u003e` | Hostname |\n| `-e USE_COOKIE_HOST=true` | Use cookie host. |\n| `-e NO_CHOWN=true`| Disable fixing permissions. |\n| `-e PUID=1000` | for UserID |\n| `-e PGID=1000` | for GroupID |\n| `-e SKIP_APP=true` | Don't start app, useful for development. |\n| `-e TZ=Europe/London` | Specify a timezone to use eg. Europe/London. |\n| `-v \u003cpath\u003e:/config` | Mount config diretory, so config persist during container restarts (option 1) |\n| `-v \u003cvolumename\u003e:/config` | Create named volume for config diretory, so config persist during container restarts (option 2)|\n| `-v /config` | Create unnamed volume for config diretory, so config persist during container restarts (option 3)|\n| `-p 3000:3000` | Expose container port |\n\n**Note:**\n\n- Configuration is stored in `/config` inside container and it is owned by *node* user with UID/GID 1000. To fix config directory ownership use `-e PUID=\u003cUID\u003e` and `-e PGID=\u003cGID\u003e`. (Here are database and config file stored)\n- The local port `3000` will be forwarded to the docker container to port `3000` (by `-p 3000:3000`)\n- In case you would like to follow the logfile, run `docker logs -f pagermon` (by `--name pagermon`)\n- To shutdown and remove the container (if using compose), run `docker-compose down`\n- If you make changes to the app for testing, you will need to re-build the image, run `docker-compose down \u0026\u0026 docker-compose up --build`\n- To run on *Raspberry Pi* use **armhf** variant (add `-armhf` at the end of version), but **be aware** that OracleDB does not work there.\n\nSee [additional parameters](https://github.com/SloCompTech/docker-baseimage).\n\n**Tip:** You probably want to setup docker log rotation before, more can be found [here](https://success.docker.com/article/how-to-setup-log-rotation-post-installation).\n\n## Running the client\n\n### Local setup\n\n\n#### Prerequisites\nThese programs/libraries are required for Pagermon Client to work\n\n* [RTL-SDR](https://www.rtl-sdr.com/rtl-sdr-quick-start-guide/) - RTL-SDR tools/libraries to access RTL-SDR dongle\n* [RTL-SDR dongle](https://www.rtl-sdr.com/buy-rtl-sdr-dvb-t-dongles/)  - You can get these from Ebay, Amazon or other stores (Has to have RTL2832U chip)\n* [nodejs](https://nodejs.org/en/) - JavaScript Programming Language (Only if installing separate from server)\n* [npm](https://www.npmjs.com/) - Javascript Package Manager (Only if installing separate from server)\n* [Git Client](https://git-scm.com/) - Github.com client for getting source code (Only if installing separate from server) \n\nTo install the Prerequisites run\n`sudo apt install nodejs npm git rtl-sdr`\n\n#### Installing Pagermon Client\nRun the following commands from Terminal:\n```\ngit clone https://github.com/pagermon/pagermon.git\ncd pagermon/client\nnpm install\n```\nedit `reader.sh` and edit frequency and rtl_device number, Edit Multimon-ng command\n```Bash\nrtl_fm -d 0 -E dc -F 0 -A fast -f 148.5875M -s22050 - |\nmultimon-ng -q -b1 -c -a POCSAG512 -f alpha -t raw /dev/stdin |\nnode reader.js\n```\n`-d 0` - change this to your rtl_device number using rtl_test\n\n`-f 148.5875M` - change this to the frequency you are decoding\n\n#### Multimon-ng Command examples\n##### POCSAG\n\u003e multimon-ng -q -b1 -c -a POCSAG512 -f alpha -t raw /dev/stdin\n\n##### FLEX\n\u003e  multimon-ng -a FLEX -t raw /dev/stdin\n\n##### EAS\n\u003e multimon-ng -a EAS -t raw /dev/stdin\n\n\n#### Configuring Pagermon Client\nBefore running Pagermon Client you have to configure it to send the decoded info to the pagermon server.\n\ncopy default.json to config.json \n```\ncp config/default.json config/config.json \n```\n\nEdit config.json with your favorite editor\n```\n{\n  \"apikey\": \"changeme\",\n  \"hostname\": \"http://127.0.0.1:3000\",\n  \"identifier\": \"TEST\",\n  \"sendFunctionCode\": false,\n  \"useTimestamp\": true,\n  \"EAS\": {\n    \"excludeEvents\": [],\n    \"includeFIPS\": [],\n    \"addressAddType\": true\n  }\n}\n\n```\n\n#### Pager Options\n\n**apikey:**  This is the API key generate on the Pagermon Server http://serverip/admin/settings\n\n**hostname:** The host name or IP of the Pagermon server (If you run Pagermon Server and Client on same PC then you can put this as `http://127.0.0.1:3000`\n\n**identifier:** This will show up in the source column on the server web page good for when you have multiple sources and want to know which one the pager message is coming from\n\n**sendFunctionCode:** This will appand the function code to the address of the message **true** or **false**\n\n**useTimestamp:** This will use the time in the message **true** or **false**\n\n#### EAS Options\n**excludeEvents:** Allows a list of [Events](https://github.com/MaxwellDPS/jsame#event-codes) to exclude ie `[\"RWT\",\"RMT\",\"SVA\"]`\n\n**includeFIPS:** Allows you to filter on a list of FIPS to alert on ie `[\"031109\", \"031000\"]`\n\n**addressAddType:** Will append the event code to the address so `KOAX-WXR` would become KOAX-WXR-W for `ZCZC-WXR-TOR-031109+0015-3650000-KOAX/NWS -` **true** or **false**\n\n\n## PagermonPi - Raspberry Pi Image\nCheck out our Raspberry Pi Image for Pi3 \u0026 Pi4 which has Pagermon pre-loaded on it.\n\nCheck out the following links:\n\n[Releases](https://github.com/pagermon/pagermon/releases) for the latest version\n[Wiki](https://github.com/pagermon/pagermon/wiki/PagermonPi-Image-For-Raspberry-Pi) for PagermonPi support\n\n## Support\n\nGeneral PagerMon support can be requested in the #support channel of the PagerMon discord server.\n\n[Click Here](https://discord.gg/3VK7gSD) to join\n\nBugs and Feature requests can be logged via the GitHub issues page. \n\n## Contributing\n\nAll are welcome to contribute. Contributors should submit a pull request with the requested changes.\n\nCHANGELOG.md is to be updated on each pull request.\n\nIf a pull request is the first pull request since a [release](https://github.com/pagermon/pagermon/releases), then the version number should be bumped in `CHANGELOG.md`, `server/app.js`, and `server/package.json`.\n\nIf a database schema change is required, this must be done using KnexJS Migration files. **Insert Instructions for this here**\n\n## Versioning\n\nWe use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/pagermon/pagermon/tags).\n\n## Authors\n\nSee the list of [contributors](https://github.com/pagermon/pagermon/contributors) who participated in this project.\n\n## License\n\nThis project is licensed under The Unlicense - because fuck licenses. Do what you want with it. :\u003e\n\n## Acknowledgments\n\n* [multimon-ng](https://github.com/EliasOenal/multimon-ng)\n* [jSAME](https://github.com/MaxwellDPS/jsame)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpagermon%2Fpagermon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpagermon%2Fpagermon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpagermon%2Fpagermon/lists"}