{"id":20839190,"url":"https://github.com/timoa/chrome-tab-rotate-server","last_synced_at":"2026-02-25T23:01:38.520Z","repository":{"id":37079635,"uuid":"185881868","full_name":"timoa/chrome-tab-rotate-server","owner":"timoa","description":"A Webserver that provides the config/contents for the chrome-tab-rotate Chrome extension","archived":false,"fork":false,"pushed_at":"2025-04-19T03:55:55.000Z","size":2358,"stargazers_count":10,"open_issues_count":22,"forks_count":2,"subscribers_count":3,"default_branch":"develop","last_synced_at":"2025-04-19T11:52:42.794Z","etag":null,"topics":["api","chrome","chrome-browser","chrome-extension","chrome-tab","configuration","content","digital-signage","managed-by-terraform","nodejs","server"],"latest_commit_sha":null,"homepage":"https://timoa.com","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/timoa.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":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-05-09T22:46:56.000Z","updated_at":"2024-08-19T07:55:30.000Z","dependencies_parsed_at":"2023-10-24T19:25:14.706Z","dependency_job_id":"c66bb0e7-fd9e-4c2d-98d6-d63aa889d5ed","html_url":"https://github.com/timoa/chrome-tab-rotate-server","commit_stats":null,"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timoa%2Fchrome-tab-rotate-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timoa%2Fchrome-tab-rotate-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timoa%2Fchrome-tab-rotate-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timoa%2Fchrome-tab-rotate-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/timoa","download_url":"https://codeload.github.com/timoa/chrome-tab-rotate-server/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253153183,"owners_count":21862322,"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":["api","chrome","chrome-browser","chrome-extension","chrome-tab","configuration","content","digital-signage","managed-by-terraform","nodejs","server"],"created_at":"2024-11-18T01:12:39.891Z","updated_at":"2026-02-25T23:01:33.473Z","avatar_url":"https://github.com/timoa.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Chrome-tab-rotate Webserver\n\n[![Latest Release][release-badge]][release-url]\n[![Build Status][github-badge]][github-url]\n[![Docker Pulls][docker-badge]][docker-url]\n\n[![Quality Gate Status][sonarcloud-status-badge]][sonarcloud-url]\n[![Security Rating][sonarcloud-security-badge]][sonarcloud-url]\n[![Maintainability Rating][sonarcloud-maintainability-badge]][sonarcloud-url]\n\n[![Bugs][sonarcloud-bugs-badge]][sonarcloud-url]\n[![Code Smells][sonarcloud-codesmells-badge]][sonarcloud-url]\n[![Coverage][sonarcloud-coverage-badge]][sonarcloud-url]\n[![Duplicated Lines (%)][sonarcloud-duplicated-badge]][sonarcloud-url]\n\nA Webserver that provides the config/contents for the [Tab Rotate][tab-rotate-chrome-extension] Chrome extension.\n\nThe Chrome extension is open-source as [chrome-tab-rotate][chrome-tab-rotate-github].\n\n\u003e This project is part of a bigger project called [ScreenKit][screenkit-github] that includes the use of Raspberry PI, [Chilipie Kiosk][chilipie-kiosk-github] (Linux OS) that starts [Chromium][chromium-project] in fullscreen and other features, the [Tab Rotate Chrome extension][tab-rotate-chrome-extension] and this project that manage the contents and screens.\n\n## Features\n\n* Simple way to rotate contents on multiple screens!\n* Allow to use multiple [Chrome Tab Rotate][tab-rotate-chrome-extension] config files (playlists)\n* Webserver (Fastify) that can serves playlists and local contents (images, videos, etc.)\n* Default playlist for new screens or for using the same content on all the screens\n* Custom playlist based on the IP of the screen (support also local proxy server)\n* Available as a Docker image or by using npm/pm2\n\n## Warning\n\nThis project is meant to be use on a private network and not hosted on Internet.\n\nCurrently, there is no authentication, that mean that anyone in your local network can access to the playlist(s). Don't include any credential (Basic Auth or token) under your URLs if you want to keep them secret.\n\nAlso don't add content that needs to stay private for the same reason.\n\n## How to start\n\n### Docker image\n\n#### Default with demo contents\n\nThe simplest way to test this project is by using Docker. The command below will launch the server with the demo contents from the `src/examples/default.json` playlist.\n\n```bash\ndocker-compose up\n```\n\nNow, you can see the Playlist (JSON format) from your browser or command line at [http://localhost:9000](http://localhost:9000)\n\n```bash\ncurl http://localhost:9000\n```\n\n#### Customize with your own contents and screens\n\nSimply copy the config files from the `src/examples` folder to the `config` folder (root of the project) and update these JSON files:\n\n| From || To |\n|---|---|---|\n|`src/examples/inventory.json`|=\u003e|`config/inventory.json`|\n|`src/examples/playlists/default.json`|=\u003e|`config/playlists/default.json`|\n\nIf you want to have a specific playlist per screen, just create a playlist that will use the screen name that you filled on the inventory file.\n\nFor example, if you have the `monitoring-01` and `monitoring-02` in your your `inventory.json` file like this:\n\n```json\n{\n  \"screens\": [\n    {\n      \"name\": \"monitoring-01\",\n      \"ip\": \"10.0.0.11\"\n    },\n    {\n      \"name\": \"monitoring-02\",\n      \"ip\": \"10.0.0.12\"\n    }\n  ]\n}\n```\n\nYou can create a playlist for each, by naming the file like this:\n\n`config/playlists/monitoring-01.json`\n`config/playlists/monitoring-02.json`\n\nNow, restart the Docker container to see the changes:\n\n```bash\ndocker-compose down\ndocker-compose up\n```\n\n```bash\ncurl http://localhost:9000\n```\n\n### Configure the Tab Rotate Chrome extension\n\nNow that you have a web server up and running, you can set the options of the Tab Rotate Chrome extension to `Remote Url` and use:\n\n* `http://localhost:9000` if the webserver is running on the same host as your Chrome browser\n* `http://{ip of your webserver}:9000` if you're using a different host to test the Chrome Extension\n\n![Tab Rotate Chrome extension options][tab-rotate-chrome-extension-options]\n\n## API Endpoints\n\n| Name | Method | Endpoint | Description |\n| --- | --- | --- | --- |\n| Playlist | `GET` | `/` | Provides the playlist based on the IP that request the endpoint or the `default` one|\n| Content | `GET` | `/content/:path` | Serve the local content from the `path` from the `/public` folder |\n| Healthcheck | `GET` | `/_health` | Allow to perform a healthcheck to see if the app is still live |\n\n## Tests\n\n### API\n\nYou can launch the Docker container or node.js app and test the endpoints with Postman:\n\n[![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/3b0cb7352985dbae6f99)\n\n### NPM\n\n#### Unit-tests\n\n```bash\nnpm test\n```\n\n#### Coverage\n\n```bash\nnpm run test:coverage\n```\n\n#### Functional\n\n```bash\nnpm run test:functional\n```\n\n*Will be replace by `chai-http` soon.*\n\n## TODO\n\n* Split screen configuration and playlist\n* Add an endpoint to get random content from a folder (images for ex.)\n* Allow to edit the playlists and screens via a CMS instead of JSON files\n* Allow to schedule specific content (JIRA board during morning standup for ex.)\n* Support multiple playlists for the same IP (2x HDMI on the RPi 4 for ex.)\n\n[sonarcloud]: https://sonarcloud.io/about\n[release-badge]: https://img.shields.io/github/v/release/timoa/chrome-tab-rotate-server?logoColor=orange\n[release-url]: https://github.com/timoa/chrome-tab-rotate-server/releases\n[github-badge]: https://github.com/timoa/chrome-tab-rotate-server/workflows/Build/badge.svg\n[github-url]: https://github.com/timoa/chrome-tab-rotate-server/actions?query=workflow%3ABuild\n[docker-badge]: https://img.shields.io/docker/pulls/timoa/chrome-tab-rotate-server.svg\n[docker-url]: https://hub.docker.com/r/timoa/chrome-tab-rotate-server\n[sonarcloud-url]: https://sonarcloud.io/dashboard?id=timoa_chrome-tab-rotate-server\n[sonarcloud-status-badge]: https://sonarcloud.io/api/project_badges/measure?project=timoa_chrome-tab-rotate-server\u0026metric=alert_status\n[sonarcloud-security-badge]: https://sonarcloud.io/api/project_badges/measure?project=timoa_chrome-tab-rotate-server\u0026metric=security_rating\n[sonarcloud-maintainability-badge]: https://sonarcloud.io/api/project_badges/measure?project=timoa_chrome-tab-rotate-server\u0026metric=sqale_rating\n[sonarcloud-bugs-badge]: https://sonarcloud.io/api/project_badges/measure?project=timoa_chrome-tab-rotate-server\u0026metric=bugs\n[sonarcloud-codesmells-badge]: https://sonarcloud.io/api/project_badges/measure?project=timoa_chrome-tab-rotate-server\u0026metric=code_smells\n[sonarcloud-coverage-badge]: https://sonarcloud.io/api/project_badges/measure?project=timoa_chrome-tab-rotate-server\u0026metric=coverage\n[sonarcloud-duplicated-badge]: https://sonarcloud.io/api/project_badges/measure?project=timoa_chrome-tab-rotate-server\u0026metric=duplicated_lines_density\n[screenkit-github]: https://github.com/timoa/screenkit\n[tab-rotate-chrome-extension]: https://chrome.google.com/webstore/detail/tab-rotate/pjgjpabbgnnoohijnillgbckikfkbjed\n[tab-rotate-chrome-extension-options]: /doc/images/tab-rotate-options.jpg\n[chrome-tab-rotate-github]: https://github.com/KevinSheedy/chrome-tab-rotate\n[chilipie-kiosk-github]: https://github.com/futurice/chilipie-kiosk\n[chromium-project]: https://www.chromium.org/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimoa%2Fchrome-tab-rotate-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftimoa%2Fchrome-tab-rotate-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimoa%2Fchrome-tab-rotate-server/lists"}