{"id":18841311,"url":"https://github.com/dmhendricks/nodejs-simple-message-relay","last_synced_at":"2026-01-30T09:30:18.111Z","repository":{"id":88694381,"uuid":"225079629","full_name":"dmhendricks/nodejs-simple-message-relay","owner":"dmhendricks","description":"A simple Node.js server to relay messages and data to listening Socket.IO clients.","archived":false,"fork":false,"pushed_at":"2020-02-02T03:07:08.000Z","size":1199,"stargazers_count":2,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-15T12:56:34.520Z","etag":null,"topics":["browser-notifications","growl","nodejs-server","socket-io","socket-io-client","socketio-messaging","socketio-server","websockets"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dmhendricks.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2019-11-30T22:51:05.000Z","updated_at":"2022-02-03T11:21:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"d7cf233b-1232-4d8c-b82e-8ee78beca27d","html_url":"https://github.com/dmhendricks/nodejs-simple-message-relay","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmhendricks%2Fnodejs-simple-message-relay","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmhendricks%2Fnodejs-simple-message-relay/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmhendricks%2Fnodejs-simple-message-relay/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dmhendricks%2Fnodejs-simple-message-relay/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dmhendricks","download_url":"https://codeload.github.com/dmhendricks/nodejs-simple-message-relay/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239780122,"owners_count":19695734,"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":["browser-notifications","growl","nodejs-server","socket-io","socket-io-client","socketio-messaging","socketio-server","websockets"],"created_at":"2024-11-08T02:50:44.949Z","updated_at":"2026-01-30T09:30:18.071Z","avatar_url":"https://github.com/dmhendricks.png","language":"JavaScript","readme":"[![Author](https://img.shields.io/badge/author-Daniel%20M.%20Hendricks-lightgrey.svg?colorB=9900cc )](https://www.danhendricks.com/?utm_source=github.com\u0026utm_medium=campaign\u0026utm_content=button\u0026utm_campaign=dmhendricks%2Fnodejs-simple-message-relay)\n[![License](https://img.shields.io/github/license/dmhendricks/nodejs-simple-message-relay.svg)](https://github.com/dmhendricks/nodejs-simple-message-relay/blob/master/LICENSE)\n[![DigitalOcean](https://img.shields.io/badge/hosting-Digital%20Ocean-green.svg?style=flat-square\u0026label=hosting\u0026colorB=0152FF)](https://m.do.co/t/8a88362f5683?utm_source=github.com\u0026utm_medium=campaign\u0026utm_content=referral\u0026utm_campaign=dmhendricks%2Fnodejs-simple-message-relay)\n[![Twitter](https://img.shields.io/twitter/url/https/github.com/dmhendricks/nodejs-simple-message-relay.svg?style=social)](https://twitter.com/danielhendricks)\n[![BrowserStack](https://img.shields.io/static/v1?style=social\u0026label=BrowserStack\u0026message=Passed\u0026logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAMAAABF0y+mAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQ1IDc5LjE2MzQ5OSwgMjAxOC8wOC8xMy0xNjo0MDoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzQ5NjEyQzJDMzUxMTFFOTlBNkZDNEVGRUQ3QUI4RDkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzQ5NjEyQzNDMzUxMTFFOTlBNkZDNEVGRUQ3QUI4RDkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NDk2MTJDMEMzNTExMUU5OUE2RkM0RUZFRDdBQjhEOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NDk2MTJDMUMzNTExMUU5OUE2RkM0RUZFRDdBQjhEOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhdfVWUAAAGAUExURXjIMP/Rhf/Xn4mHhwpRXnrY8CIXFv41Sk68OACv2QC+6svIAP5oEAC+6H7ToKa3nP9fF//AT/+tfPjVzpTPHf+6Rf1GLcbVAJDd8P/9+v/qyf/EY/+mNXHLidKyF126Mv/26anm8/+8TP/68P1jAFHO8lPAYu+SDqrh7v+xR/0eOgC/rIGvM7SvI9qKjAC+6lG5wf+SM/+2mOGnGf8NMgCcvLLEw5OZOv0yMfvARRfD7v+VSf9lZ/9mOqTs9lvAQ/+EK/+VY7Hr/f+cN0+7Lb2FMuqFG7tuOv9jEOCLLP93JKzj+ZDYwwC9s2LLrQB8k/9wEv+4R/9oD5/g1b3iAACtygCJo//w6MnHyPM5M+h3NuVyfcLPZP9MWKOYXMevu/+Xn5HG06nWAwDG8pzn6//lsZ/l85rik/+def/38fNoILPS3/1tF/+3Zf+sROmuICWPq3edprrG0VTW26jn/EhteD7CN9ibbgC8t/96NPmLQIjPY/9CKSQfIP///////+tAimMAAACAdFJOU/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AOAVLZwAAAj9JREFUeNpU0vtb0lAYB/CzCTgeDrQpGwyUyzZwwwyBmTRNELwgkYpQZkUXumktyrJ13eFf9z0CZd8ftufZZ9/znPOcFw1HIWezp+u9Xm/9xaw8nASNXsczfNk0c2VJOjGni2fXkRQ1KWeWdxKBSCSS2DuZZslflDepPX76LrS/P/+7343slWfkMRJque+djGXlIcuo301IH+URFjU+Z97ayAAEIfl8NtxN3GUIxWMNS+aTDS/QysHBij8YXOTC3b21N4DkFIrTH95alt/j+nw+z0owmE32A78UdYhS2JZg0aiV9/hc1zc1C7q4hbolgx0ilgd8vuG1HoK5rkxcT/B+kusHDEFGm5ot5b6kvZbnCh9Nua7/R5ILR9piDP3EVxgdowtPPzRR5I7IIpvi7bSeGSPEvzhCBjUp3rjQo5/H6PO8mt8CbCtxuixvPnut695J1f+1wnHhgAG4pmG7vBu6p6ej367O+cALRa7/SQQsahjzJ8kWaPrl+fmy9yIEVgnUBdhQ7BBj+8+uE9KBa7WaTntcf2EgwFHkAlSxtOpkQ61OpxWqUAuXqoKiyIgwUMVHoFtcpcJRclAJG7AqQUN1DlPlt5OO44A4laUFvi4oYgqujLB1qrjxfnv1JmRp54gvgMGowGXL8blDnpYbDfpPg7dpLy6PZkgVjCrW8Cg8rhpggjqZPjUuGoWmDWQ3CwOB9tR/cyuzoqC0B4OBoVASWfn6UJMUo4gAVBQmRf6beGA1xsQVJc7EVDL5dinAAO2UucfjcPEkAAAAAElFTkSuQmCC)](https://browserstack.com/?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=link\u0026utm_campaign=dmhendricks%2Fnodejs-simple-message-relay)\n\n# Node.js Simple Message Relay\n\nA simple example of using [Node.js](https://nodejs.org/) to send Growl-style messages to a browser via [Socket.IO](https://socket.io/).\n\n- [Installation](#installation)\n- [Configuration](https://github.com/dmhendricks/nodejs-simple-message-relay/wiki/Configuration)\n\t- [Setting Environment](https://github.com/dmhendricks/nodejs-simple-message-relay/wiki/Configuration#setting-environment)\n- [Usage](#usage)\n\t- [Client-Side Example Code](https://github.com/dmhendricks/nodejs-simple-message-relay/wiki/Client-Side-Example-Code)\n- [Screenshot](#screenshot)\n\n:pushpin: Available on Docker Hub: [hendridm/socketio-relay](https://hub.docker.com/r/hendridm/socketio-relay)\n\n### Requirements\n\n- [Node.js](https://nodejs.org/)\n\n### How It Works\n\n**The server does one thing:** It accepts JSON data submitted to the endpoint and forwards it to the specified socket. It will relay _any_ data that you submit - it is up to the listening client to consume it.\n\nYou can have any number of clients listening to different sockets. In this way, you can have multiple apps listening for different events and different payloads. Purely as examples, you could have all of the following:\n\n- An admin panel that listens on a socket named `admin-notifications`, receiving information about system events.\n- An e-commerce site that listens on a socket named `sales-popups`, which displays a sale notification to visitors, similar to [Sales Pop](http://sales-pop.demo.beeketing.com/).\n- A real-time chat application that listens on a socket named `chat-app`, which broadcasts user messages as they are submitted.\n\nThese are just examples - you can relay any data to any number of sockets that you wish. **The included demo page is simply an example of consuming data received from the server.** Your usage will vary.\n\n### Goals\n\n- [x] Add simple Growl-style example\n- [x] Add advanced example with custom template and image\n- [ ] Improve input validation\n- [ ] Improve exception handling\n- [ ] WordPress plugin and integrations\n\n## Installation\n\nTo install, clone the repository, install dependencies and start the server:\n\n```bash\ngit clone https://github.com/dmhendricks/nodejs-simple-message-relay.git\ncd nodejs-simple-message-relay\nnpm install\nnpm run start\n```\n:pushpin: For local development, you can use `npm run dev` instead to automatically reload the server as you modify and save files.\n\n## Usage\n\n1. Visit [http://localhost:3000/](http://localhost:3000/) in your web browser to bring up the client-side browser demo (disabled if `demo_page` is false in [config](https://github.com/dmhendricks/nodejs-simple-message-relay/wiki/Configuration)).\n2. Use [Postman](https://www.getpostman.com/) or cURL to send a POST to the `/send` endpoint:\n\n**Send a Simple Notification**\n\n```bash\ncurl -X POST 'http://localhost:3000/send/my-socket-name?api_key=YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"message\": \"Hello world!\",\n    \"color\": \"info\"\n}'\n```\n\n**Send an Advanced Notification**\n\n```bash\ncurl -X POST 'http://localhost:3000/send/my-socket-name?api_key=YOUR_API_KEY' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n\t\"type\": \"advanced\",\n\t\"message\": \"Someone in Chicago, USA just bought a \u003cstrong\u003eToolbox Widget/Modular Toolbox Wrench Organizer\u003c/strong\u003e!\",\n\t\"link\": \"https://smile.amazon.com/dp/B07H6FJY9D/\",\n\t\"image\": \"https://picsum.photos/id/237/200/200\"\n}'\n```\n\nAfter sending one or more messages, they should appear on the browser demo page. See [`public/index.html`](https://github.com/dmhendricks/nodejs-simple-message-relay/blob/master/public/index.html) for source code.\n\n**Note:** The `api_key` query string variable may be absent in [development](https://github.com/dmhendricks/nodejs-simple-message-relay/wiki/Configuration#setting-environment) mode (ie, when `NODE_ENV` is not defined).\n\n## Screenshot\n\n![Screenshot](https://raw.githubusercontent.com/dmhendricks/nodejs-simple-message-relay/master/public/assets/images/screenshot.gif)\n\n[![Analytics](https://ga-beacon.appspot.com/UA-126205765-1/dmhendricks/nodejs-simple-message-relay?flat)](https://ga-beacon.appspot.com/?utm_source=github.com\u0026utm_medium=campaign\u0026utm_content=button\u0026utm_campaign=dmhendricks%2Fnodejs-simple-message-relay)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmhendricks%2Fnodejs-simple-message-relay","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdmhendricks%2Fnodejs-simple-message-relay","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdmhendricks%2Fnodejs-simple-message-relay/lists"}