{"id":20384859,"url":"https://github.com/Screenly/Browser-Extension","last_synced_at":"2025-05-08T09:32:31.583Z","repository":{"id":262312285,"uuid":"885297645","full_name":"Screenly/Browser-Extension","owner":"Screenly","description":"Browser extension for Screenly that works with Firefox and Chrome.","archived":false,"fork":false,"pushed_at":"2025-04-24T15:42:07.000Z","size":1188,"stargazers_count":4,"open_issues_count":11,"forks_count":2,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-05-01T07:42:21.418Z","etag":null,"topics":["chrome-extension","firefox-addon"],"latest_commit_sha":null,"homepage":"https://www.screenly.io/tutorials/browser-extensions/","language":"TypeScript","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/Screenly.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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":"2024-11-08T10:15:31.000Z","updated_at":"2025-04-24T15:42:11.000Z","dependencies_parsed_at":"2024-11-11T19:27:47.497Z","dependency_job_id":"4571c52a-1a27-4eea-b947-7b4b08e61b6d","html_url":"https://github.com/Screenly/Browser-Extension","commit_stats":null,"previous_names":["screenly/chrome-extension","screenly/browser-extension"],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Screenly%2FBrowser-Extension","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Screenly%2FBrowser-Extension/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Screenly%2FBrowser-Extension/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Screenly%2FBrowser-Extension/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Screenly","download_url":"https://codeload.github.com/Screenly/Browser-Extension/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253036716,"owners_count":21844268,"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":["chrome-extension","firefox-addon"],"created_at":"2024-11-15T02:30:08.395Z","updated_at":"2025-05-08T09:32:31.572Z","avatar_url":"https://github.com/Screenly.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"/docs/images/banner.svg\" alt=\"Extension Banner\" width=\"90%\"\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/Screenly/Browser-Extension/actions/workflows/build.yaml?query=branch%3Amaster\"\u003e\n        \u003cimg alt=\"GitHub Actions Workflow Status\"\n            src=\"https://img.shields.io/github/actions/workflow/status/Screenly/Browser-Extension/build.yaml?label=Build%20Browser%20Extensions\u0026branch=master\u0026style=for-the-badge\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/Screenly/Browser-Extension/actions/workflows/lint-and-format.yaml?query=branch%3Amaster\"\u003e\n        \u003cimg alt=\"GitHub Actions Workflow Status\" src=\"https://img.shields.io/github/actions/workflow/status/Screenly/Browser-Extension/lint-and-format.yaml?branch=master\u0026style=for-the-badge\u0026label=ESLint%20and%20Prettier\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://app.sbomify.com/component/NwxGnn8u8K\"\u003e\n        \u003cimg src=\"https://img.shields.io/badge/_-sbomified-8A2BE2?style=for-the-badge\u0026logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjU3IiBoZWlnaHQ9IjI1NyIgdmlld0JveD0iMCAwIDI1NyAyNTciIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjEyOC41IiBjeT0iMTI4LjUiIHI9IjEyOC41IiBmaWxsPSIjMTQxMDM1Ii8+CjxwYXRoIGQ9Ik02My45Mzc5IDgwLjAwMDlDNTcuNTM3NCA3OS45MTMyIDU3LjUyNDkgODkuOTk4OSA2My45Mzc5IDg5LjkxMTJIOTcuNzI4NUMxMDQuMTU0IDkwLjAyNCAxMDQuMTY3IDc5Ljg4ODIgOTcuNzI4NSA4MC4wMDA5SDYzLjkzNzlaTTExMy43OCA4MC4wMDA5QzEwNy40MDQgNzkuOTEzMiAxMDcuMzY3IDg5Ljk5ODkgMTEzLjc4IDg5LjkxMTJIMTk0LjA3NUMxOTYuOCA4OS45MTEyIDE5OSA4Ny42OTM2IDE5OSA4NC45NzQ5QzE5OSA4Mi4yMzExIDE5Ni44IDgwLjAxMzUgMTk0LjA3NSA4MC4wMTM1SDExMy43OFY4MC4wMDA5Wk02My45Mzc5IDk3LjE0MDRDNTcuNTQ5OSA5Ny4wNTI3IDU3LjUxMjQgMTA3LjE1MSA2My45Mzc5IDEwNy4wNTFIMTE5LjM1NUMxMjIuMDgxIDEwNy4wNTEgMTI0LjI4MSAxMDQuODMzIDEyNC4yODEgMTAyLjEwMkMxMjQuMjkzIDk5LjM3MDUgMTIyLjA4MSA5Ny4xNDA0IDExOS4zNTUgOTcuMTQwNEg2My45Mzc5Wk02My45Mzc5IDExNC4zMDVDNTcuNTYyNCAxMTQuMjE3IDU3LjUxMjQgMTI0LjI3OCA2My45Mzc5IDEyNC4xOUgxNDQuNjdDMTQ3LjM5NSAxMjQuMTkgMTQ5LjU5NiAxMjEuOTcyIDE0OS41OTYgMTE5LjI1NEMxNDkuNTk2IDExNi41MjIgMTQ3LjM4MyAxMTQuMzE3IDE0NC42NyAxMTQuMzE3SDYzLjkzNzlWMTE0LjMwNVpNMTk0LjA3NSAxNzYuOTk5QzIwMC40NzUgMTc3LjA4NyAyMDAuNDg4IDE2Ny4wMDEgMTk0LjA3NSAxNjcuMDg5SDE2MC4yODRDMTUzLjg1OCAxNjYuOTc2IDE1My44NDYgMTc3LjExMiAxNjAuMjg0IDE3Ni45OTlIMTk0LjA3NVpNMTQ0LjIyIDE3Ni45OTlDMTUwLjU5NiAxNzcuMDg3IDE1MC42MzMgMTY3LjAwMSAxNDQuMjIgMTY3LjA4OUg2My45MjU0QzYxLjIxMjcgMTY3LjEwMSA1OSAxNjkuMzA2IDU5IDE3Mi4wMzhDNTkgMTc0Ljc4MSA2MS4yMDAyIDE3Ni45OTkgNjMuOTI1NCAxNzYuOTk5SDE0NC4yMlpNMTk0LjA3NSAxNTkuODZDMjAwLjQ2MyAxNTkuOTQ3IDIwMC41IDE0OS44NDkgMTk0LjA3NSAxNDkuOTQ5SDEzOC42NTdDMTM1LjkzMiAxNDkuOTQ5IDEzMy43MzIgMTUyLjE2NyAxMzMuNzMyIDE1NC44OThDMTMzLjcxOSAxNTcuNjMgMTM1LjkzMiAxNTkuODYgMTM4LjY1NyAxNTkuODZIMTk0LjA3NVpNMTk0LjA3NSAxNDIuNjk1QzIwMC40NSAxNDIuNzgzIDIwMC41IDEzMi43MjIgMTk0LjA3NSAxMzIuODFIMTEzLjM0MkMxMTAuNjE3IDEzMi44MSAxMDguNDE3IDEzNS4wMjggMTA4LjQxNyAxMzcuNzQ2QzEwOC40MTcgMTQwLjQ3OCAxMTAuNjMgMTQyLjY4MyAxMTMuMzQyIDE0Mi42ODNIMTk0LjA3NVYxNDIuNjk1WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzM5Nl8yOTcpIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMzk2XzI5NyIgeDE9IjU5IiB5MT0iMTI4LjUiIHgyPSIyMDIuMjMzIiB5Mj0iMTQxLjU2NyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBvZmZzZXQ9IjAuMDYiIHN0b3AtY29sb3I9IiM0MDU5RDAiLz4KPHN0b3Agb2Zmc2V0PSIwLjU1NSIgc3RvcC1jb2xvcj0iI0NDNThCQiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNGNEI1N0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K\"\u003e\n    \u003c/a\u003e\n    \u003cbr\u003e\n    \u003ca noopener\" href=\"https://chromewebstore.google.com/detail/save-to-screenly/kcoehkngnbhlmdcgcadliaadlmbjmcln\"\u003e\n      \u003cimg alt=\"Chrome Web Store Version\" src=\"https://img.shields.io/chrome-web-store/v/kcoehkngnbhlmdcgcadliaadlmbjmcln?style=for-the-badge\u0026logo=google-chrome\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://addons.mozilla.org/en-US/firefox/addon/save-to-screenly/\"\u003e\n      \u003cimg alt=\"Mozilla Add-on Version\" src=\"https://img.shields.io/amo/v/save-to-screenly?style=for-the-badge\u0026logo=firefox-browser\"\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cstrong\u003eEasily add content to your Screenly digital signage displays in a few clicks. :sparkles:\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n## :white_check_mark: Prerequisites\n\n- Linux or macOS \u0026mdash; If you're on Windows, you can use [WSL](https://learn.microsoft.com/en-us/windows/wsl/setup/environment). All of the scripts were written in Bash.\n- Docker \u0026mdash; The easiest way to get started is to install [Docker Desktop](https://www.docker.com/products/docker-desktop/).\n- `jq` \u0026mdash; Most of the scripts in the [`bin/`](/bin/) directory use `jq` to parse JSON. Install it from [here](https://jqlang.org/download/).\n\n## :seedling: Install\n\n- Install the extension from the [Chrome Web Store](https://chromewebstore.google.com/detail/save-to-screenly/kcoehkngnbhlmdcgcadliaadlmbjmcln).\n- Install the extension from Firefox [Add Ons](https://addons.mozilla.org/en-US/firefox/addon/save-to-screenly/).\n\n## :computer: Develop\n\nThe extension is built using [webpack](https://webpack.js.org/). Please check our [contributing guidelines](CONTRIBUTING.md) for detailed information about opening pull requests and releasing new versions.\n\n```bash\n$ PLATFORM=\u003cPLATFORM\u003e \\\n  VERSION=\u003cVERSION\u003e \\\n    ./bin/start_development_mode.sh\n```\n\n\u003e [!IMPORTANT]\n\u003e\n\u003e - `VERSION` can be any valid version semver string (`X.Y.Z`),\n\u003e   where `X`, `Y`, and `Z` are non-negative numbers.\n\u003e - `PLATFORM` can be either `chrome` or `firefox`.\n\nNow load the content of the `dist/` folder as an unpacked extension in Chrome. As you make changes to the code, the extension is automatically rebuilt.\n\n### Getting Inside the Docker Container\n\n```bash\n$ docker compose exec browser-extension bash\n```\n\n### Distribute\n\n```bash\n$ VERSION=\u003cVERSION\u003e \\\n  PLATFORM=\u003cPLATFORM\u003e \\\n    ./bin/package_extension.sh\n```\n\nThe name of the packaged extension will be `screenly-\u003cPLATFORM\u003e-extension-\u003cVERSION\u003e.zip`. For example, `screenly-chrome-extension-0.0.1.zip` or `screenly-firefox-extension-0.0.1.zip`.\n\n### Testing Packaged Extensions\n\n\u003e [!NOTE]\n\u003e You can also download the packaged extensions from the [GitHub Releases](https://github.com/Screenly/Browser-Extension/releases) page.\n\n#### Chrome\n\n- Extract the zip file to a folder.\n- Open Chrome and navigate to `chrome://extensions/`.\n- Click on **Load unpacked** and select the folder you extracted the zip file to.\n- The extension should now be loaded and ready to use.\n\n#### Firefox\n\n\u003e [!IMPORTANT]\n\u003e Add-ons installed from a `.zip` file will be uninstalled when Firefox is closed.\n\u003e This means that you will need to re-install the extension every time you open Firefox.\n\n- Open Firefox and navigate to `about:debugging`.\n- Click on **This Firefox** and then **Load Temporary Add-on**.\n- You can either select the `manifest.json` file or the zipped extension.\n- The extension should now be loaded and ready to use.\n\n## :test_tube: Run Unit Tests\n\n```bash\n$ ./bin/run_tests.sh\n\nRandomized with seed \u003cSEED\u003e\nStarted\n....................\n\n\n20 specs, 0 failures\nFinished in 0.01 seconds\nRandomized with seed \u003cSEED\u003e (jasmine --random=true --seed=\u003cSEED\u003e)\n```\n\n## :sparkles: Run Linter and Formatter\n\nBuild the Docker image, which is a one-time operation:\n\n```bash\n$ docker compose build\n```\n\n### :broom: Run Linter\n\n```bash\n$ ./bin/run_eslint.sh\n```\n\nThis will run ESLint on the codebase and show any style issues or potential problems that need to be fixed.\n\n### :nail_care: Run Formatter\n\nThis project uses [Prettier](https://prettier.io/) to format the code.\nFor more information why the linter and formatter are separate, see [this article about ESLint deprecating formatting rules](https://eslint.org/blog/2023/10/deprecating-formatting-rules/).\n\nTo check the code for formatting issues without changing any files, use the `check` mode:\n\n```bash\n$ MODE=\"check\" ./bin/run_formatter.sh\n```\n\nTo format the code and fix formatting issues, use the `write` mode:\n\n```bash\n$ MODE=\"write\" ./bin/run_formatter.sh\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FScreenly%2FBrowser-Extension","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FScreenly%2FBrowser-Extension","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FScreenly%2FBrowser-Extension/lists"}