{"id":15285702,"url":"https://github.com/hyprspace/hyprspace","last_synced_at":"2026-04-02T13:40:35.318Z","repository":{"id":237772880,"uuid":"792799102","full_name":"hyprspace/hyprspace","owner":"hyprspace","description":"A Lightweight VPN Built on top of IPFS + Libp2p for Truly Distributed Networks (fork)","archived":false,"fork":false,"pushed_at":"2026-03-26T00:37:47.000Z","size":1576,"stargazers_count":215,"open_issues_count":25,"forks_count":16,"subscribers_count":7,"default_branch":"master","last_synced_at":"2026-03-26T19:00:51.802Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://docs.hyprspace.privatevoid.net","language":"Go","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/hyprspace.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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":null,"dco":null,"cla":null}},"created_at":"2024-04-27T16:02:26.000Z","updated_at":"2026-03-26T00:37:02.000Z","dependencies_parsed_at":"2024-05-18T23:25:41.027Z","dependency_job_id":"6d70886d-877e-4e4d-a9a5-7c15116696e4","html_url":"https://github.com/hyprspace/hyprspace","commit_stats":{"total_commits":197,"total_committers":11,"mean_commits":17.90909090909091,"dds":0.4568527918781726,"last_synced_commit":"b54fd70812b98994630cfa6aac17ad7c2be9b468"},"previous_names":["privatevoid-net/hyprspace","hyprspace/hyprspace"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/hyprspace/hyprspace","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyprspace%2Fhyprspace","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyprspace%2Fhyprspace/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyprspace%2Fhyprspace/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyprspace%2Fhyprspace/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hyprspace","download_url":"https://codeload.github.com/hyprspace/hyprspace/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyprspace%2Fhyprspace/sbom","scorecard":{"id":475718,"data":{"date":"2025-08-11","repo":{"name":"github.com/hyprspace/hyprspace","commit":"8f5778dffe153c0e9fda807dc488c4182359e512"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.6,"checks":[{"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":"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":"Code-Review","score":2,"reason":"Found 7/29 approved changesets -- score normalized to 2","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":3,"reason":"3 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.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":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.11.0 not signed: https://api.github.com/repos/hyprspace/hyprspace/releases/229246854","Warn: release artifact v0.11.0 does not have provenance: https://api.github.com/repos/hyprspace/hyprspace/releases/229246854"],"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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 30 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":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2024-3218"],"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-19T15:14:47.030Z","repository_id":237772880,"created_at":"2025-08-19T15:14:47.030Z","updated_at":"2025-08-19T15:14:47.030Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31307196,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":[],"created_at":"2024-09-30T15:07:13.702Z","updated_at":"2026-04-02T13:40:35.293Z","avatar_url":"https://github.com/hyprspace.png","language":"Go","funding_links":[],"categories":["Apps","Go"],"sub_categories":[],"readme":"\u003cimg src=\"hyprspace.png\" width=\"150\"\u003e\n\n# Hyprspace\n\nA Lightweight VPN Built on top of IPFS \u0026 Libp2p for Truly Distributed Networks. \n\n[Documentation](https://docs.hyprspace.privatevoid.net/)\n\nhttps://user-images.githubusercontent.com/19558067/152407636-a5f4ae1f-9493-4346-bf73-0de109928415.mp4\n\n\n## Table of Contents\n- [About the Fork](#about-the-fork)\n- [A Bit of Backstory](#a-bit-of-backstory)\n- [Use Cases](#use-cases)\n  - [A Digital Nomad](#a-digital-nomad)\n  - [A Privacy Advocate](#a-privacy-advocate)\n- [Installation](#installation)\n- [Usage](#usage)\n  - [Commands](#commands)\n- [Tutorial](#tutorial)\n- [Hacking](#hacking)\n\n## About the Fork\n\nThis fork has started on [Sep 25, 2022 in the Depot monorepo](https://github.com/privatevoid-net/depot/commit/9df627a8d2b82a1dad06e3c7b22fae263c8cd0dc), when I (@max-privatevoid) decided I'd hack on the project a bit and improve it in ways that would benefit my personal use cases. This has led to some significant changes.\n\nThe original author of this project has [archived it on Feb 24, 2024](https://github.com/alecbcs/hyprspace). I've extracted my modified codebase from the monorepo, as a way to revive the project for others who also want to continue using and improving it.\n\n## A Bit of Backstory\n[Libp2p](https://libp2p.io) is a networking library created by [Protocol Labs](https://protocol.ai) that allows nodes to discover each other using a Distributed Hash Table. Paired with [NAT hole punching](https://en.wikipedia.org/wiki/Hole_punching_(networking)) this allows Hyprspace to create a direct encrypted tunnel between two nodes even if they're both behind firewalls.\n\n**Moreover! Each node doesn't even need to know the other's ip address prior to starting up the connection.** This makes Hyprspace perfect for devices that frequently migrate between locations but still require a constant virtual ip address.\n\n### So How Does Hyprspace Compare to Something Like Wireguard?\n[WireGuard](https://wireguard.com) is an amazing VPN written by Jason A. Donenfeld. If you haven't already, definitely go check it out! WireGuard actually inspired me to write Hyprspace. That said, although WireGuard is in a class of its own as a great VPN, it requires at least one of your nodes to have a public IP address. In this mode, as long as one of your nodes is publicly accessible, it can be used as a central relay to reach the other nodes in the network. However, this means that all of the traffic for your entire system is going through that one system which can slow down your network and make it fragile in the case that node goes down and you lose the whole network. So instead say that you want each node to be able to directly connect to each other as they do in Hyprspace. Unfortunately through WireGuard this would require every node to be publicly addressable which means manual port forwarding and no travelling nodes.\n\nBy contrast Hyprspace allows all of your nodes to connect directly to each other creating a strong reliable network even if they're all behind their own NATs/firewalls. No manual port forwarding required! \n\n## Use Cases:\n##### A Digital Nomad\nI use this system when travelling, if I'm staying in a rental or hotel and want to try something out on a Raspberry Pi I can plug the Pi into the location's router or ethernet port and then just ssh into the system using the same-old internal Hyprspace ip address without having to worry about their NAT or local firewall. Furthermore, if I'm connected to the Virtual Hyprspace Network I can ssh into my machines at home without requiring me to set up any sort of port forwarding.\n\n##### A Privacy Advocate\nHonestly, I even use this system when I'm at home and could connect directly to my local infrastructure. Using Hyprspace however, I don't have to trust the security of my local network and Hyprspace will intelligently connect to my machines using their local ip addresses for maximum speed.\n\nIf anyone else has some use cases please add them! Pull requests welcome!\n\n| :exclamation: | Hyprspace is still a very new project. Although we've tested the code locally for security, it hasn't been audited by a third party yet. We probably wouldn't trust it yet in high security environments. |\n| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n\n## Getting Started\n\n### Installation\n\nHyprspace requires [Nix](https://nixos.org/) to build.\n\n```shell-session\n$ nix build github:hyprspace/hyprspace\n```\n\nHyprspace also offers a NixOS module. To use it, simply import `nixosModules.default` in your NixOS configuration and use the options under `services.hyprspace`.\nThis will create a systemd service that runs `hyprspace up` with a generated config file.\n\n```nix\n{\n  services.hyprspace = {\n    enable = true;\n\n    # To get a private key and peer ID, use `hyprspace init`\n    privateKeyFile = \"/example/secrets/hyprspace-private-key\";\n\n    # Same as the config file\n    settings = {\n      peers = [\n        { id = \"12D3KooWKgq4aJpZM8Peer1\"; }\n        { id = \"12D3KooWKgq4aJpZM8Peer2\"; }\n      ];\n    };\n  };\n}\n```\n\nAlso take a look at the [configuration docs](https://docs.hyprspace.privatevoid.net/configuration.html).\n\n## Usage\n\n### Commands\n\n| Command             |  Alias  | Description                                                                |\n| ------------------- | ------- | -------------------------------------------------------------------------- |\n| `help`              | `?`     | Get help with a specific subcommand.                                       |\n| `init`              | `i`     | Initialize an interface's configuration.                                   |\n| `up`                | `up`    | Create and bring up a Hyprspace interface                                  |\n| `status`            | `s`     | Inspect the status of a Hyprspace daemon                                   |\n| `peers`             |         | List connected LibP2P peers                                                |\n| `route`             | `r`     | Inspect and modify the route table                                         |\n\n### Global Flags\n| Flag                |  Alias  | Description                                                                |\n| ------------------- | ------- | -------------------------------------------------------------------------- |\n| `--config`          | `-c`    | Specify the path to a hyprspace config for an interface.                   |\n| `--interface`       | `-i`    | The Hyprspace interface to operate on.                                     |\n\n\n## Tutorial\n\n### Initializing an Interface\n\nThe first thing we'll want to do once we've got Hyprspace installed is\ninitialize the configuration for an interface. The default interface name is `hyprspace`.\nIn this example we'll call the interface on our local machine `hs0` (for hypr-space 0) and `hs1` on our remote server but yours could be anything you'd like.\n\n(Note: if you're using a Mac you'll have to use the interface name `utun[0-9]`. Check which interfaces are already in use by running `ip a` once you've got `iproute2mac` installed.)\n\n(Note: if you're using Windows you'll have to use the interface name as seen in Control Panel. IP address will be set automatically only if you run Hyprspace as Administrator.)\n\n###### Local Machine\n```shell-session\n$ sudo hyprspace init -i hs0\n```\n\n###### Remote Machine\n```shell-session\n$ sudo hyprspace init -i hs1\n```\n\n### Add Each Machine As A Peer Of The Other\n\nNow that we've got a set of configurations we'll want to\ntell the machines about each other. By default Hyprspace will\nput the interface configurations in `/etc/hyprspace/interface-name.json`.\nYou can also create the config file elsewhere by specifying a custom config path.\n\n```shell-session\n$ hyprspace init -c hyprspace-config-hs0.json\n```\n\nSo for our example we'll run\n\n###### Local Machine\n```shell-session\n$ sudo $EDITOR /etc/hyprspace/hs0.json\n```\n\nand\n\n###### Remote Machine\n```shell-session\n$ sudo $EDITOR /etc/hyprspace/hs1.json\n```\n\n### Update Peer Configs\n\nNow in each config we'll add the other machine's ID as a peer.\nHyprspace will print a config snippet like this one and instruct you to add it to your other peers:\n```json\n{\n  \"name\": \"hostname1\",\n  \"id\": \"12D3KExamplePeer1\"\n}\n```\n\nUpdate\n\n```json\n{\n  \"peers\": [],\n  \"privateKey\": \"z23ExamplePrivateKey\"\n}\n```\nto \n```json\n{\n  \"peers\": [\n    {\n      \"name\": \"hostname1\",\n      \"id\": \"12D3KExamplePeer1\"\n    }\n  ],\n  \"privateKey\": \"z23ExamplePrivateKey\"\n}\n```\n\nPreviously, it was necessary to manually configure IP addresses for all peers. Now, an IP address from the 100.64.0.0/16 range is automatically allocated to each peer based on its peer ID.\n\nYou can specify additional routes for each peer as well:\n\n```json\n{\n  \"peers\": [\n    {\n      \"name\": \"hostname1\",\n      \"id\": \"12D3KExamplePeer1\"\n      \"routes\": [\n        { \"net\": \"10.1.1.1/32\" },\n        { \"net\": \"10.1.2.0/24\" }\n      ]\n    }\n  ],\n  \"privateKey\": \"z23ExamplePrivateKey\"\n}\n```\n\n### Starting Up the Interfaces!\nNow that we've got our configs all sorted we can start up the two interfaces!\n\n###### Local Machine\n```shell-session\n$ sudo hyprspace up -i hs0\n```\n\nand\n\n###### Remote Machine\n```shell-session\n$ sudo hyprspace up -i hs1\n```\n\nAfter a few seconds you should see a the network finish setting up\nand find your other machine. We can now test the connection by\npinging back and forth across the network.\n\n###### Local Machine\n```shell-session\n$ ping 100.64.90.181\n```\n\nWe can get some more information about the status of the network as well.\n\n###### Local Machine\n```shell-session\n$ sudo hyprspace status -i hs0\nPeerID: 12D3KExamplePeer1\nSwarm peers: 7\nConnected VPN nodes: 1/1\n    @hostname2 (365.516µs) /ip4/.../udp/8001/quic-v1/p2p/12D3KExamplePeer2\nAddresses:\n    /ip4/.../tcp/8001\n    (...)\n```\n\n### Stopping the Interface and Cleaning Up\nNow to stop the interface and clean up the system, simply kill the proceses (for example, by pressing Ctrl+C where you started it).\n\n## Hacking\n\nIf you want to hack on Hyprspace, check out the [development docs](https://docs.hyprspace.privatevoid.net/Development.html) for a quick introduction.\n\n## Disclaimer \u0026 Copyright\n\nWireGuard is a registered trademark of Jason A. Donenfeld.\n\n## License\n\nCopyright 2022-2024 Max Headroom \u003cmax@privatevoid.net\u003e\n\nCopyright 2021-2022 Alec Scott \u003chi@alecbcs.com\u003e\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhyprspace%2Fhyprspace","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhyprspace%2Fhyprspace","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhyprspace%2Fhyprspace/lists"}