{"id":40739881,"url":"https://github.com/partout-io/partout","last_synced_at":"2026-05-11T10:06:04.002Z","repository":{"id":272578007,"uuid":"915988459","full_name":"partout-io/partout","owner":"partout-io","description":"The easiest way to build cross-platform tunnel apps.","archived":false,"fork":false,"pushed_at":"2026-03-30T12:10:52.000Z","size":3018,"stargazers_count":63,"open_issues_count":56,"forks_count":12,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-03-30T13:30:42.074Z","etag":null,"topics":["combine","ios","macos","network-extension","openvpn","openvpn-client","osx","ovpn","tvos","vpn","wireguard"],"latest_commit_sha":null,"homepage":"","language":"Swift","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/partout-io.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","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},"funding":{"github":"partout-io","custom":["https://buymeacoffee.com/partout.io"]}},"created_at":"2025-01-13T08:41:03.000Z","updated_at":"2026-03-30T12:10:53.000Z","dependencies_parsed_at":"2025-11-29T14:05:12.248Z","dependency_job_id":null,"html_url":"https://github.com/partout-io/partout","commit_stats":null,"previous_names":["passepartoutvpn/passepartoutkit","passepartoutvpn/partout","partout-io/partout"],"tags_count":98,"template":false,"template_full_name":null,"purl":"pkg:github/partout-io/partout","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/partout-io%2Fpartout","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/partout-io%2Fpartout/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/partout-io%2Fpartout/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/partout-io%2Fpartout/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/partout-io","download_url":"https://codeload.github.com/partout-io/partout/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/partout-io%2Fpartout/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31293123,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"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":["combine","ios","macos","network-extension","openvpn","openvpn-client","osx","ovpn","tvos","vpn","wireguard"],"created_at":"2026-01-21T15:04:44.927Z","updated_at":"2026-05-04T18:01:33.652Z","avatar_url":"https://github.com/partout-io.png","language":"Swift","funding_links":["https://github.com/sponsors/partout-io","https://buymeacoffee.com/partout.io"],"categories":[],"sub_categories":[],"readme":"![iOS 16+](https://img.shields.io/badge/ios-16+-green.svg)\n![macOS 13+](https://img.shields.io/badge/macos-13+-green.svg)\n![tvOS 17+](https://img.shields.io/badge/tvos-17+-green.svg)\n[![License GPLv3](https://img.shields.io/badge/license-GPLv3-lightgray.svg)](LICENSE)\n\n[![Unit Tests](https://github.com/partout-io/partout/actions/workflows/test.yml/badge.svg)](https://github.com/partout-io/partout/actions/workflows/test.yml)\n[![Release](https://github.com/partout-io/partout/actions/workflows/release.yml/badge.svg)](https://github.com/partout-io/partout/actions/workflows/release.yml)\n\n# [Partout](https://partout.io)\n\n_The easiest way to build cross-platform tunnel apps_.\n\nPartout is a _multilanguage_ library using [Swift][swift] and C at its core. It provides VPN functionality through the [Network Extension][network-extension] framework on Apple platforms, but it partially works on Android, Linux, and Windows (with [Wintun][wintun]). I'm documenting the long journey of making Partout fully cross-platform [in a blog series][blog], where I write about the challenges of Swift on non-Apple targets, and how I'm overcoming them.\n\nPartout is the backbone of [Passepartout][passepartout]. The footprint is kept in check on non-Apple platforms by reimplementing a small subset of Swift Foundation in the `MiniFoundation` targets.\n\n## Usage\n\n**As per the GPL, the public license is not suitable for the App Store and other closed-source distributions. If you want to use Partout for proprietary or commercial purposes, please [obtain a proper license][license-website].**\n\n### SwiftPM\n\nImport the library as a SwiftPM dependency:\n\n```swift\ndependencies: [\n    .package(url: \"https://github.com/partout-io/partout\", branch: \"master\")\n],\ntargets: [\n    .target(\n        name: \"MyTarget\",\n        dependencies: [\"partout\"]\n    )\n]\n```\n\n### CMake\n\nPartout can be imported as a CMake project. The exported target is `partout`.\n\n#### Requirements\n\n- Swift\n- C/C++ build tools\n- CMake\n- ninja\n- Android NDK (optional)\n- [Swift Android SDK][swift-android-sdk] (optional)\n\nThese are the requirements for Partout, but additional build tools may be required depending on the vendors build system.\n\n#### Build\n\nFirst, fetch all the vendored submodules:\n\n```shell\ngit submodule init\ngit submodule update --recursive\n```\n\nThen, you will use one of the `scripts/build.*` variants based on the host platform:\n\n- `scripts/build.sh` (bash)\n- `scripts/build.ps1` (Windows PowerShell)\n\nThe script builds the vendors as static libraries and accepts a few options: \n\n- `-a`: Build everything\n- `-config (Debug|Release)`: The CMake build type\n- `-android`: Build for Android\n- `-l`: Build the Partout library (opt-in)\n- `-crypto (openssl|native)`: Pick a crypto subsystem between OpenSSL and Native/MbedTLS (WIP)\n- `-wireguard`: Enable support for WireGuard (requires Go)\n\nFor example, this will build Partout for release with a dependency on OpenSSL:\n\n```shell\n$ scripts/build.sh -config Release -l -crypto openssl\n```\n\nSample output:\n\n```\nbin/darwin-arm64/libpartout.a       # macOS\nbin/linux-aarch64/libpartout.a      # Linux\nbin/windows-arm64/libpartout.lib    # Windows\nbin/android-aarch64/libpartout.a    # Android\n```\n\nAdditionally, `libpartout_c` must be linked. Partout must be bundled with the shared vendored libraries and the Swift runtime to work.\n\nBuilding for Android requires access to external SDKs:\n\n- `$ANDROID_NDK_ROOT` to point to your Android NDK installation\n- `$SWIFT_ANDROID_SDK` to point to your Swift for Android SDK installation (e.g. in `~/.swiftpm/swift-sdks`)\n\nThe CMake configuration is done with the `android.toolchain.cmake` toolchain. The script runs on macOS, but can be adapted for other platforms with slight tweaks to `scripts/build.sh`.\n\n#### Codegen\n\nPartout comes with a [code generator][partout-codegen] that translates Swift data entities to a formal OpenAPI specification for non-Swift consumers.\n\n```\nswift run partout-codegen --manifest scripts/manifest.yaml\n```\n\n`partout-codegen` uses [swift-syntax][credits-swift-syntax] to build an intermediate representation (IR) of the Swift data entities, then proceeds to map it to the OpenAPI format. [openapi-generator][openapi-generator] can eventually be used to generate the Partout data models for other languages.\n\n## Demo\n\n### Xcode\n\nThere is an Xcode Demo in the `Examples` directory. Edit `Demo/Config.xcconfig` with your developer details. You must comply with all the capabilities and entitlements in the main app and the tunnel extension target.\n\nPut your configuration files into `Demo/App/Files` with these names:\n\n- OpenVPN configuration: `test-sample.ovpn`\n- OpenVPN credentials (in two lines): `test-sample.txt`\n- WireGuard configuration: `test-sample.wg`\n\nOpen `Demo.xcodeproj` and run the `PartoutDemo` target.\n\n## License\n\nCopyright (c) 2026 Davide De Rosa. All rights reserved.\n\nThe library is licensed under the [GPLv3][license]. The `MiniFoundation` targets are MIT-licensed.\n\n### Contributing\n\nBy contributing to this project you are agreeing to the terms stated in the [Contributor License Agreement (CLA)][contrib-cla]. For more details please see [CONTRIBUTING][contrib-readme].\n\n## Credits\n\nLibraries:\n\n- [GenericJSON][credits-genericjson]\n- [MbedTLS][credits-mbedtls]\n- [OpenSSL][credits-openssl]\n- [SwiftSyntax][credits-swift-syntax]\n- [url.c][credits-url.c]\n- [Wintun][credits-wintun]\n- [WireGuard (Go)][credits-wireguard-go]\n\nSpecial contributors:\n\n- [Tejas Mehta][credits-tmthecoder] for the implementation of the [OpenVPN XOR patch][credits-tmthecoder-xor]\n\n### OpenSSL\n\nThis product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/)\n\n### OpenVPN\n\n© Copyright 2026 OpenVPN | OpenVPN is a registered trademark of OpenVPN, Inc.\n\n### WireGuard\n\n© Copyright 2015-2026 Jason A. Donenfeld. All Rights Reserved. \"WireGuard\" and the \"WireGuard\" logo are registered trademarks of Jason A. Donenfeld.\n\n## Contacts\n\nTwitter: [@keeshux][about-twitter]\n\nWebsite: [partout.io][about-website]\n\n[passepartout]: https://passepartoutvpn.app/\n[swift]: https://swift.org/\n[swift-android-sdk]: https://github.com/swift-android-sdk/swift-android-sdk\n[network-extension]: https://developer.apple.com/documentation/networkextension/\n[protobuf]: https://protobuf.dev/\n[kotlin]: https://kotlinlang.org/\n[wintun]: https://git.zx2c4.com/wintun/about/\n[blog]: https://davidederosa.com/cross-platform-swift/\n[license]: LICENSE\n[license-website]: https://partout.io/license\n[contrib-cla]: CLA.rst\n[contrib-readme]: CONTRIBUTING.md\n[partout-codegen]: https://github.com/partout-io/codegen\n[openapi-generator]: https://openapi-generator.tech/\n\n[github-releases]: https://github.com/partout-io/partout/releases\n[credits-genericjson]: https://github.com/iwill/generic-json-swift\n[credits-mbedtls]: https://github.com/Mbed-TLS/mbedtls\n[credits-openssl]: https://github.com/openssl/openssl\n[credits-swift-syntax]: https://github.com/swiftlang/swift-syntax\n[credits-tmthecoder]: https://github.com/tmthecoder\n[credits-tmthecoder-xor]: https://github.com/partout-io/tunnelkit/pull/255\n[credits-url.c]: https://github.com/cozis/url.c\n[credits-uuidv4]: https://github.com/rxi/uuid4\n[credits-wintun]: https://github.com/wireguard/wintun\n[credits-wireguard-go]: https://github.com/wireguard/wireguard-go\n\n[about-twitter]: https://twitter.com/keeshux\n[about-website]: https://github.com/partout-io\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpartout-io%2Fpartout","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpartout-io%2Fpartout","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpartout-io%2Fpartout/lists"}