{"id":15711764,"url":"https://github.com/jacksteamdev/example-linux-hosted-crx","last_synced_at":"2025-07-02T02:02:21.911Z","repository":{"id":218807138,"uuid":"450203784","full_name":"jacksteamdev/example-linux-hosted-crx","owner":"jacksteamdev","description":null,"archived":false,"fork":false,"pushed_at":"2022-09-02T22:12:45.000Z","size":2677,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-30T17:47:15.314Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jacksteamdev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2022-01-20T18:00:22.000Z","updated_at":"2024-01-23T21:00:35.000Z","dependencies_parsed_at":null,"dependency_job_id":"94a2d250-3818-4d0a-a934-5391f3a8eee8","html_url":"https://github.com/jacksteamdev/example-linux-hosted-crx","commit_stats":null,"previous_names":["jacksteamdev/example-linux-hosted-crx"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jacksteamdev/example-linux-hosted-crx","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jacksteamdev%2Fexample-linux-hosted-crx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jacksteamdev%2Fexample-linux-hosted-crx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jacksteamdev%2Fexample-linux-hosted-crx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jacksteamdev%2Fexample-linux-hosted-crx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jacksteamdev","download_url":"https://codeload.github.com/jacksteamdev/example-linux-hosted-crx/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jacksteamdev%2Fexample-linux-hosted-crx/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261716266,"owners_count":23198926,"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":[],"created_at":"2024-10-03T21:13:53.874Z","updated_at":"2025-07-02T02:02:21.879Z","avatar_url":"https://github.com/jacksteamdev.png","language":"JavaScript","readme":"# Linux Extension Update Server\n\nThis project contains a naive implementation of a Chrome extension update server\nand utilities to create a CRX file and extract the id and key from the private\nkey.\n\n\u003e While the server will run on any OS, only Linux supports installing Chrome\n\u003e extensions distributed from an origin other than the Chrome Web Store. See\n\u003e [Google documentation](https://developer.chrome.com/docs/extensions/mv3/external_extensions/#preferences).\n\n## Usage\n\n```sh\n# install dependencies\npnpm install\n# run the server and open chromium w/ local data dir\npnpm start\n# restart server+chromium on file changes\npnpm dev\n# pack /crx and print id+key\npnpm pack-crx\n```\n\nThe sample extension will open a tab with update info when an update occurs.\n\nThe extension action will request an update check and display the results as a\nbadge and title.\n\n## Notes\n\nAn extension must be packed into a CRX file before distribution. Chrome supports\npacking an extension from the command line. `./src/packCrx.mjs` outlines this\nprocess.\n\nOpenSSL can extract the extension id and key from a PEM file.\n`./src/getCrxId.mjs` and `./src/getCrxKey.mjs` contain the relevant shell\ncommands.\n\nChrome supports forced Linux installations by way of a preferences JSON file\nplaced in the app extensions folder. The module `./src/installCrx.mjs` outlines\nhow to do this.\n\nThe server has two endpoints: an update endpoint and a download endpoint. The\nupdate endpoint must end in `.xml`; Chrome will append `.xml` to any update URL\nthat does not end with that extension.\n\nIf the user manually uninstalls the extension, Chrome places it on a blocklist\nand will ignore the preferences file. During development we can remove an\nextension id from the blocklist by manually installing the CRX file and removing\nit.\n\n## References\n\n- [Alternative extension installation methods - Chrome Developers](https://developer.chrome.com/docs/extensions/mv3/external_extensions/#preferences)\n- [Obtaining Chrome Extension ID for development - Stack Overflow](https://stackoverflow.com/questions/23873623/obtaining-chrome-extension-id-for-development)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjacksteamdev%2Fexample-linux-hosted-crx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjacksteamdev%2Fexample-linux-hosted-crx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjacksteamdev%2Fexample-linux-hosted-crx/lists"}