{"id":37843901,"url":"https://github.com/pyrho/alfred-firefoxtabswitch","last_synced_at":"2026-01-16T16:01:54.058Z","repository":{"id":42294274,"uuid":"240974951","full_name":"pyrho/alfred-firefoxtabswitch","owner":"pyrho","description":"An Alfred workflow for quickly switching between Firefox tabs","archived":false,"fork":false,"pushed_at":"2022-12-10T18:27:02.000Z","size":3344,"stargazers_count":12,"open_issues_count":14,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-19T15:51:33.277Z","etag":null,"topics":["alfred-workflow","firefox","native-messaging","webextension"],"latest_commit_sha":null,"homepage":"","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/pyrho.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}},"created_at":"2020-02-16T22:17:54.000Z","updated_at":"2024-08-31T11:03:46.000Z","dependencies_parsed_at":"2023-01-26T08:01:13.916Z","dependency_job_id":null,"html_url":"https://github.com/pyrho/alfred-firefoxtabswitch","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/pyrho/alfred-firefoxtabswitch","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyrho%2Falfred-firefoxtabswitch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyrho%2Falfred-firefoxtabswitch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyrho%2Falfred-firefoxtabswitch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyrho%2Falfred-firefoxtabswitch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pyrho","download_url":"https://codeload.github.com/pyrho/alfred-firefoxtabswitch/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyrho%2Falfred-firefoxtabswitch/sbom","scorecard":{"id":751826,"data":{"date":"2025-08-11","repo":{"name":"github.com/pyrho/alfred-firefoxtabswitch","commit":"edd631bab9bcb172131fe9f4e381e68a182a5339"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/29 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: UNLICENSE:0","Info: FSF or OSI recognized license: The Unlicense: UNLICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"68 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25","Warn: Project is vulnerable to: GHSA-pp7h-53gx-mx7r","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-gp2j-mg4w-2rh5","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-ff7x-qrg7-qggm","Warn: Project is vulnerable to: GHSA-4gmj-3p3h-gm8h","Warn: Project is vulnerable to: GHSA-8gh8-hqwg-xf34","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-rc47-6667-2j5j","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-282f-qqgm-c34q","Warn: Project is vulnerable to: GHSA-8cf7-32gw-wr33","Warn: Project is vulnerable to: GHSA-hjrf-2m68-5959","Warn: Project is vulnerable to: GHSA-qwph-4952-7xr6","Warn: Project is vulnerable to: GHSA-jg8v-48h5-wgxg","Warn: Project is vulnerable to: GHSA-36fh-84j7-cv5h","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-8hfj-j24r-96c4","Warn: Project is vulnerable to: GHSA-wc69-rhjr-hc9g","Warn: Project is vulnerable to: GHSA-92xj-mqp7-vmcj","Warn: Project is vulnerable to: GHSA-wxgw-qj99-44c2","Warn: Project is vulnerable to: GHSA-5rrq-pxf6-6jx5","Warn: Project is vulnerable to: GHSA-8fr3-hfg3-gpgp","Warn: Project is vulnerable to: GHSA-gf8q-jrpm-jvxq","Warn: Project is vulnerable to: GHSA-2r2c-g63r-vccr","Warn: Project is vulnerable to: GHSA-cfm4-qjh2-4765","Warn: Project is vulnerable to: GHSA-x4jg-mjrx-434g","Warn: Project is vulnerable to: GHSA-5fw9-fq32-wv5p","Warn: Project is vulnerable to: GHSA-px4h-xg32-q955","Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-4cpg-3vgw-4877","Warn: Project is vulnerable to: GHSA-566m-qj78-rww5","Warn: Project is vulnerable to: GHSA-hwj9-h5mp-3pm3","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-g4rg-993r-mgx7","Warn: Project is vulnerable to: GHSA-4rq4-32rv-6wp6","Warn: Project is vulnerable to: GHSA-64g7-mvw6-v9qj","Warn: Project is vulnerable to: GHSA-29xr-v42j-r956","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7","Warn: Project is vulnerable to: GHSA-6fc8-4gx4-v693","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-776f-qx25-q3cc","Warn: Project is vulnerable to: GHSA-h6q6-9hqw-rwfv","Warn: Project is vulnerable to: GHSA-5fg8-2547-mr8q","Warn: Project is vulnerable to: GHSA-crh6-fp67-6883","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-22T20:35:45.110Z","repository_id":42294274,"created_at":"2025-08-22T20:35:45.110Z","updated_at":"2025-08-22T20:35:45.110Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28479458,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["alfred-workflow","firefox","native-messaging","webextension"],"created_at":"2026-01-16T16:01:53.948Z","updated_at":"2026-01-16T16:01:54.030Z","avatar_url":"https://github.com/pyrho.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"2020-10-06: *You're really better off using [this](https://github.com/deanishe/alfred-firefox) workflow instead*\n\nAlfred Firefox Tab switcher\n===========================\n\n![demo gif](./demo.gif)\n\nAn [Alfred](https://www.alfredapp.com/) workflow to quickly switch between\nfirefox tabs.\n\n# Installation\n\n## Requirements\n\n- [nodeJS](https://nodejs.org/en/) (tested with version 13.7)\n- [Node Package Manager (npm)](https://www.npmjs.com/) (usually installed alongside\n    nodeJS)\n- [Alfred](https://www.alfredapp.com/) + Powerpack License\n\n## 1. Install the workflow\n\nYou need to install the workflow first as it will also install the native\nmessaging host component of the extension (required before the extension is\nstarted).\n\n```\nmkdir -p \"~/Library/Application Support/Mozilla/NativeMessagingHosts/\"\nnpm install -g alfred-firefoxtabswitch\n```\n\nThe workflow will register automatically with Alfred, and the\n[Native Manifest](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Native_manifests)\nwill be written automatically upon install at `/Library/Application Support/Mozilla/NativeMessagingHosts/alfredtabswitch.json`\n\n## 2. Install the Firefox extension\n\nGo to https://addons.mozilla.org/en-US/firefox/addon/alfred-tab-switch/ and\ninstall it from there.\n\n# Usage\n\nInvoke the workflow with `fw` (you can customize that in Alfred), all opened\ntabs (across all windows) will be shown.\n\nIf more than one argument is supplied to the workflow, all arguments must be\npresent in either the title or the URL.\n\nThen simply hit ENTER on the tab you want to focus.\n\n\n# Similar\n\nI only discovered the existence of [a\npre-existing](https://github.com/deanishe/alfred-firefox) workflow by the\nlegendary @deanishe **after** doing all of this ... Yeah I know.\n\nWhile my one focused on tab switching only, the other one is much more\nfeatureful; so give that a try if you need more.\n\n# Architecture\n\n```\n                                                    ┌───────────┐\n                                                    │  Alfred   │\n                                                    └───────────┘\n                                                          ▲\n                        ╭──────────────╮                  │\n                        │ ◎ ○ ○ ░░░░░░░│                  │\n                        ├──────────────┤            ┌─────┴─────┐\n                        │              │            │UDP socket │\n                        │              │            └─────┬─────┘\n                        │              │                  │\n                        │       ┌──────┴─────┐            ▼\n                        └───────┤ Extension  ├───────────────────────────┐\n                                └──────────┬─┘  Native Messaging Host    │\n                                           └─────────────────────────────┘\n```\n\nThe firefox extension will automatically spawn the native messaging host at\nstartup.\n\nThe host will open an UDP socket on port `52547` and listen for incoming\nconnections.\n\nAlfred interacts with Firefox via the UDP socket, querying for the list of tabs,\nand commanding to switch to a given tab. These inteactions are handled by the\n`./host/client.js` file (spawned by alfred).\n\nEach time the user issues a command, Alfred will spawn an instance of\n`host/client.js`, which will talk to the UDP socket and kill itself when the\nresult is returned.\n\nIf the native messaging host fails to reply within 1 second, the client will\nkill itself.\n\n\n## Why so complex?\n\n[Other workflows](https://github.com/stuartcryan/rapid-browser-tabs-for-alfred)\nuse Apple Script to switch tabs for Safari, Chrome etc.\n\nBut Firefox does not expose its tabs to the system, so the only way is to use an\nextension with an native messaging component that allows alfred to communicate\nwith firefox.\n\n# Troubleshooting\n\nIf shit ain't working, check the following (in that order):\n\n## Check the native message host manifest\n\n```bash\n❯ cat ~/Library/Application\\ Support/Mozilla/NativeMessagingHosts/alfredtabswitch.json\n{\n  \"name\": \"alfredtabswitch\",\n  \"description\": \"A Native Messaging host that enables quickly switching between tabs using Alfred\",\n  \"path\": \"/usr/local/lib/node_modules/alfred-firefoxtabswitch/host/app.js\",\n  \"type\": \"stdio\",\n  \"allowed_extensions\": [\n    \"alfredtabswitch@25.wf\"\n  ]\n}  \n```\n\n## Check that the native messaging host is started by Firefox\n\nFind the PID of the native messaging host process.\n```bash\n❯ lsof -i UDP:52547 # 52547 is the port used by our UDP socket.\nCOMMAND   PID  USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME\nnode    13578 pyrho   56u  IPv4 0xef6cec813ce54835      0t0  UDP localhost:52547\n```\n\nConfirm with pstree that this is indeed a process spawned by firefox\n```bash\n❯ pstree -g3 -p 13578 # -p `PID`, we got the PID from the command above\n─┬= 00001 root /sbin/launchd\n └─┬= 13534 pyrho /Applications/Firefox Developer Edition.app/Contents/MacOS/firefox\n   └─── 13578 pyrho /usr/local/bin/node /usr/local/lib/node_modules/alfred-firefoxtabswitch/host/app.js /Users/pyrho/Library/Application Support/Moz\n```\n\nIf you have a similar output, the issue is elsewhere.\n\n## Open the extension debugger\nOpen firefox and go to `about:devtools-toolbox?type=extension\u0026id=alfredtabswitch%4025.wf`\ncheck the console and see if there is any error messages.\n\n## Try the client manually\nGo to `/usr/local/lib/node_modules/alfred-firefoxtabswitch/host` and run `❯ node client.js get`, you should be greeted \nwith a JSON object representing the list of tabs:\n```json\n{\n\t\"items\": [\n\t\t{\n\t\t\t\"title\": \"Purify - Functional programming library for TypeScript\",\n\t\t\t\"subtitle\": \"https://gigobyte.github.io/purify/adts/Maybe\",\n\t\t\t\"arg\": \"0:3\"\n\t\t}\n\t]\n}\n```\n\n## Enable native messaging host debug logs\nGo to `/usr/local/lib/node_modules/alfred-firefoxtabswitch/host`, and edit he\n`utils.js` file to uncomment the line with the `appendFileSync`\n\nThis will log some information to the specified file.\n\nDo not try to launch the host (app.js) manually, that is not how native\nmessaging works (well you can, but it won't really do anything).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpyrho%2Falfred-firefoxtabswitch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpyrho%2Falfred-firefoxtabswitch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpyrho%2Falfred-firefoxtabswitch/lists"}