{"id":13596741,"url":"https://github.com/jamesmcm/vopono","last_synced_at":"2026-10-19T13:44:26.357Z","repository":{"id":39902217,"uuid":"266547189","full_name":"jamesmcm/vopono","owner":"jamesmcm","description":"Run applications through VPN tunnels with temporary network namespaces","archived":false,"fork":false,"pushed_at":"2026-09-16T08:08:02.000Z","size":3914,"stargazers_count":1342,"open_issues_count":84,"forks_count":82,"subscribers_count":12,"default_branch":"master","last_synced_at":"2026-09-18T06:11:43.352Z","etag":null,"topics":["hacktoberfest","mullvad","openvpn","rust","rust-lang","wireguard"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jamesmcm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","claude":null,"gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null}},"created_at":"2020-05-24T13:31:20.000Z","updated_at":"2026-09-17T21:01:28.000Z","dependencies_parsed_at":"2026-08-26T10:22:04.436Z","dependency_job_id":null,"html_url":"https://github.com/jamesmcm/vopono","commit_stats":{"total_commits":301,"total_committers":23,"mean_commits":13.08695652173913,"dds":0.1960132890365448,"last_synced_commit":"ef608e7bdbfde345a01ecdf206c757c09a46cf5b"},"previous_names":[],"tags_count":58,"template":false,"template_full_name":null,"purl":"pkg:github/jamesmcm/vopono","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamesmcm%2Fvopono","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamesmcm%2Fvopono/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamesmcm%2Fvopono/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamesmcm%2Fvopono/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jamesmcm","download_url":"https://codeload.github.com/jamesmcm/vopono/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jamesmcm%2Fvopono/sbom","scorecard":{"id":504022,"data":{"date":"2025-08-11","repo":{"name":"github.com/jamesmcm/vopono","commit":"4d22055f478bb59f8254b4c6266db744a8abbab0"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/16 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":"Maintained","score":10,"reason":"30 commit(s) and 18 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/pr.yml:1","Warn: no topLevel permission defined: .github/workflows/rust.yml:1","Info: no jobLevel write permissions found"],"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":"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":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"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":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 0.10.14 not signed: https://api.github.com/repos/jamesmcm/vopono/releases/237729485","Warn: release artifact 0.10.13 not signed: https://api.github.com/repos/jamesmcm/vopono/releases/226903075","Warn: release artifact 0.10.12 not signed: https://api.github.com/repos/jamesmcm/vopono/releases/220846349","Warn: release artifact 0.10.11 not signed: https://api.github.com/repos/jamesmcm/vopono/releases/192787554","Warn: release artifact 0.10.10 not signed: https://api.github.com/repos/jamesmcm/vopono/releases/148890077","Warn: release artifact 0.10.14 does not have provenance: https://api.github.com/repos/jamesmcm/vopono/releases/237729485","Warn: release artifact 0.10.13 does not have provenance: https://api.github.com/repos/jamesmcm/vopono/releases/226903075","Warn: release artifact 0.10.12 does not have provenance: https://api.github.com/repos/jamesmcm/vopono/releases/220846349","Warn: release artifact 0.10.11 does not have provenance: https://api.github.com/repos/jamesmcm/vopono/releases/192787554","Warn: release artifact 0.10.10 does not have provenance: https://api.github.com/repos/jamesmcm/vopono/releases/148890077"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/pr.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/pr.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:150: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust.yml:157: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:161: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:170: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust.yml:177: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:181: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:209: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:212: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:221: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:235: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:244: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:253: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:262: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:271: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:280: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:289: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:298: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:307: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:316: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:325: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:69: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:78: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust.yml:81: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:83: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:134: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust.yml:137: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:141: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:190: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust.yml:197: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:201: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust.yml:53: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:55: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:92: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust.yml:95: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:97: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:106: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust.yml:109: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:111: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:120: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/rust.yml:123: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/rust.yml:125: update your workflow using https://app.stepsecurity.io/secureworkflow/jamesmcm/vopono/rust.yml/master?enable=pin","Info:   0 out of  39 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  10 third-party GitHubAction dependencies pinned"],"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 25 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"}}]},"last_synced_at":"2025-08-19T22:49:43.281Z","repository_id":39902217,"created_at":"2025-08-19T22:49:43.281Z","updated_at":"2025-08-19T22:49:43.281Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":344872684,"owners_count":38357849,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-10-03T21:59:58.778Z","status":"online","status_checked_at":"2026-10-19T02:00:06.414Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["hacktoberfest","mullvad","openvpn","rust","rust-lang","wireguard"],"created_at":"2024-08-01T16:02:44.634Z","updated_at":"2026-10-19T13:44:26.349Z","avatar_url":"https://github.com/jamesmcm.png","language":"Rust","funding_links":[],"categories":["Rust","rust"],"sub_categories":[],"readme":"![vopono logo](logos/vopono_banner_transparent.png)\n\nvopono is a tool to run applications through VPN tunnels via temporary\nnetwork namespaces. This allows you to run only a handful of\napplications through different VPNs simultaneously, whilst keeping your main connection\nas normal.\n\nvopono includes built-in killswitches for both Wireguard and OpenVPN.\n\nCurrently Mullvad, AzireVPN, MozillaVPN, ProtonVPN, iVPN,\nNordVPN, AirVPN, and PrivateInternetAccess are supported directly, with custom\nconfiguration files also supported with the `--custom` argument.\nCloudflare Warp is also supported.\n\nFor custom connections the OpenConnect and OpenFortiVPN protocols are\nalso supported (e.g. for enterprise VPNs). See the [vopono User Guide](USERGUIDE.md) for more details.\n\n## Screenshot\n\nScreenshot showing an example with firefox, google-chrome-stable and\nlynx all running through different VPN connections:\n\n![Screenshot](screenshot.png)\n\n## Supported Providers\n\n| Provider                      | OpenVPN support | Wireguard support |\n| ----------------------------- | --------------- | ----------------- |\n| Mullvad                       | ❌              | ✅                |\n| AzireVPN                      | ❌              | ✅                |\n| iVPN                          | ✅              | ✅                |\n| PrivateInternetAccess         | ✅              | ✅\\*              |\n| ProtonVPN                     | ✅\\*\\*          | ✅\\*\\*\\*          |\n| MozillaVPN                    | ❌              | ✅                |\n| NordVPN                       | ✅              | ❌                |\n| AirVPN                        | ✅              | ✅                |\n| Cloudflare Warp\\*\\*\\*\\*       | ❌              | ❌                |\n| Self host (--custom)          | ✅              | ✅                |\n\n\\* Port forwarding supported with the `--port-forwarding` option and `--port-forwarding-callback` to run a command when the port is refreshed.\n\n\\*\\* See the [User Guide](USERGUIDE.md) for authentication instructions for generating the OpenVPN config files via `vopono sync`. You must copy the authentication header of the form `AUTH-xxx=yyy` where `yyy` is the value of the `x-pm-uid` header in the same request when logged in, in your web browser.\n\n\\*\\*\\* For ProtonVPN you can generate and download specific Wireguard config\nfiles, and use them as a custom provider config. See the [User Guide](USERGUIDE.md)\nfor details. [Port Forwarding](https://protonvpn.com/support/port-forwarding-manual-setup/) is supported with the `--port-forwarding` argument for both OpenVPN and Wireguard.\nNote for using a custom config with Wireguard, the port forwarding implementation to be used should be specified with `--custom-port-forwarding`\n(i.e. with `--provider custom --custom xxx.conf --protocol wireguard --custom-port-forwarding protonvpn` ). `natpmpc` must be installed.\nNote for OpenVPN you must generate the OpenVPN config files appending `+pmp` to your OpenVPN username, and you must choose servers which support this feature\n(e.g. at the time of writing, the Romania servers do). The assigned port is then printed to the terminal where vopono was launched - this should then be set in any applications that require it.\nThe port can also be passed to a custom script that will be executed\nwithin the network namespace via the `--port-forwarding-callback`\nargument.\n\n\\*\\*\\*\\* Cloudflare Warp uses its own protocol. Set both the provider and\nprotocol to `warp`. Note you must first register with `sudo warp-cli registration new` and then run it once with `sudo warp-svc` and `sudo warp-cli connect` and `sudo warp-cli debug connectivity-check disable` outside of vopono - then kill `sudo warp-svc` without running `sudo warp-cli disconnect` so it will auto-connect when run.\nPlease verify this works first before trying it with vopono. \n\nAirVPN port forwarding is supported as a provider capability, but forwarded\nports must currently be configured in AirVPN's client area; vopono does not\nclaim or toggle AirVPN account ports automatically.\n\n\n## Usage\n\nSet up VPN provider configuration files:\n\n```bash\n$ vopono sync\n```\n\nNote when creating and uploading new Wireguard keypairs there may be a slight delay\nuntil they are usable (about 30-60 seconds on Mullvad for example).\n\nRun Firefox through an AzireVPN Wireguard connection to a server in\nNorway:\n\n```bash\n$ vopono exec --provider azirevpn --server norway firefox\n```\n\nYou should run vopono as your own user (not using sudo) as it will\nhandle privilege escalation where necessary. For more details around\nrunning as a systemd service, etc. see the [User Guide](USERGUIDE.md).\n\n### Daemon Mode\n\nFor a smoother experience, run the privileged root daemon and keep using `vopono` as your normal user. The CLI automatically forwards `exec` requests to the daemon if it’s running.\n\n- Start once at boot via systemd: `sudo systemctl enable --now vopono`\n- Or run manually as root: `sudo vopono daemon`\n- The explicit equivalent is `sudo vopono daemon start`; inspect it with\n  `vopono daemon status --json`.\n- Then use vopono normally as your user: `vopono exec --provider mullvad --server se firefox`\n\nSee [USERGUIDE.md](USERGUIDE.md) for a ready‑to‑copy systemd unit.\n\nvopono can handle up to 255 separate network namespaces (i.e. different VPN server\nconnections - if your VPN provider allows it). Commands launched with\nthe same server prefix and VPN provider will share the same network\nnamespace.\n\nDefault configuration options can be saved in the `~/.config/vopono/config.toml`\nfile, for example:\n\n```toml\nfirewall = \"NfTables\"\nprovider = \"Mullvad\"\nprotocol = \"Wireguard\"\nserver = \"usa-us22\"\n```\n\nNote that the values are case-sensitive.\n\nSee the [vopono User Guide](USERGUIDE.md) for much more detailed usage instructions\n(including handling daemons and servers).\n\n## Installation\n\n### AUR (Arch Linux)\n\nInstall the `vopono-git` package with your favourite AUR helper.\n\n```bash\n$ paru -S vopono-git\n$ vopono sync\n```\n\nAlternatively use the `vopono-bin` package if you don't want to compile\nfrom source.\n\n### Raspberry Pi (Raspbian)\n\nDownload and install the `vopono_x.y.z_armhf.deb` package from the\nreleases page:\n\n```bash\n$ sudo dpkg -i vopono_0.2.1_armhf.deb\n```\n\nYou will need to install OpenVPN (available in the Raspbian repos):\n\n```bash\n$ sudo apt install openvpn\n```\n\nYou can then use vopono as above (note that the Chromium binary is\n`chromium-browser`):\n\n```bash\n$ vopono sync --protocol openvpn protonvpn\n$ vopono exec --provider protonvpn --server sweden chromium-browser\n```\n\nScreenshot of vopono with OpenVPN running on Raspbian:\n\n![Raspbian Screenshot](rpi_screen.png)\n\nNote Wireguard is not in the Raspbian repositories, so installing it is\nnot trivial. You can follow [this guide](https://www.sigmdel.ca/michel/ha/wireguard/wireguard_02_en.html) to attempt it, but note that\nnot only do you need to install Wireguard and `wireguard-tools` to have `wg`\navailable, but also the `linux-headers` to ensure it works correctly\n(i.e. you don't just get `Protocol not supported` errors when trying to\nestablish a connection).\n\nCheck the [User Guide](USERGUIDE.md) for details on port forwarding and\nusing vopono with daemons and servers, in case you want to use your\nRaspberry Pi to run privoxy or transmission-daemon, etc.\n\n### Debian + Ubuntu\n\nInstall the deb package provided on the releases page.\n\n### Fedora + OpenSUSE\n\nInstall the rpm package provided on the release page (choose the correct\nversion).\n\n### Gentoo Linux\n\nInstall `vopono` from the main repository.\n\n```bash\n$ emerge -av net-vpn/vopono\n```\n\n### Other Linux\n\nEither use the compiled binaries on the release page, or install from\nsource with Cargo as documented below.\n\n### From this repository (with Cargo)\n\nRun the install script provided: `install.sh` - this will `cargo install` the repository and copy over the configuration files to\n`~/.config/vopono/`\n\nNote the minimum supported Rust version is 1.85 (required for edition 2024).\nYou can check your version with:\n\n```bash\n$ rustc --version\n```\n\n## Known issues\n\n- When launching a new application in an existing vopono namespace, any\n  modifications to the firewall rules (i.e. forwarding and opening\n  ports) will not be applied (they are only used when creating the\n  namespace). The same applies for port forwarding.\n- OpenVPN credentials are always stored in plaintext in configuration - may add\n  option to not store credentials, but it seems OpenVPN needs them\n  provided in plaintext.\n- There is no easy way to delete MozillaVPN devices (Wireguard\n  keypairs) - unlike Mullvad this _cannot_ be done on the webpage. I recommend using [MozWire](https://github.com/NilsIrl/MozWire) to manage this.\n- `gnome-terminal` will not run in the network namespace due to the\n  client-server model - see issue [#48](https://github.com/jamesmcm/vopono/issues/48)\n- Port forwarding from inside the network namespace to the host (e.g.\n  for running `transmission-daemon`) does not work correctly when vopono\n  is run as root - see issue [#84](https://github.com/jamesmcm/vopono/issues/84)\n\n## License\n\nvopono is licensed under the GPL Version 3.0 (or above), see the LICENSE\nfile or https://www.gnu.org/licenses/gpl-3.0.en.html\n\n## Etymology\n\nvopono is the pronunciation of the letters VPN in Esperanto.\n\nSe vi ankaŭ parolas Esperanton, bonvolu serĉi min en la kanalo de\nDiscord de Rust Programming Language Community.\n\n## Contribution\n\nUnless you explicitly state otherwise, any contribution intentionally submitted\nfor inclusion in the work by you, will be licensed under the GPLv3 (or\nabove), without any additional terms or conditions.\n\nMany thanks to NilsIrl's [MozWire](https://github.com/NilsIrl/MozWire)\nfor the investigation of the MozillaVPN API.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjamesmcm%2Fvopono","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjamesmcm%2Fvopono","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjamesmcm%2Fvopono/lists"}