Native Swift apps for iPhone, iPad, and Apple TV. Supports multiple VPN protocols (WireGuard, AmneziaWG, OpenVPN, IKEv2, Stealth, WStunnel), per-Wi-Fi configuration, On-Demand mode, Siri/Shortcuts integration, and a home-screen widget.
- Install from the App Store
- Build from source
- Testing
- Linting
- Contributing
- Versioning
- Acknowledgements
apps.apple.com/us/app/windscribe-vpn/id1129435228
| Tool | Version |
|---|---|
| Xcode | 26.3 (pinned in CI) |
| iOS deployment target | 15.0 (iOS 18 minimum coming in the next major rebuild) |
| tvOS deployment target | 17.5 |
| Swift | 5.0 / 6.0 (mixed — targets are migrating) |
| Go | 1.22+ (for the WireGuard-go bridge) |
| Ruby | for fastlane (see Gemfile) |
| swiftlint | for lint checks |
Physical iOS/tvOS hardware is required to actually run a tunnel. Simulators build and launch, but cannot bring up a Network Extension.
-
Clone and open the project:
git clone <repo-url> iosapp cd iosapp open Windscribe.xcodeproj
-
Override
Windscribe/Environments/Config.xcconfigwith your own signing values. The default file points at Windscribe's team / bundle IDs:APP_TEAM_ID = <your Apple Developer team ID> APP_BUNDLE_ID = <your reverse-DNS bundle ID>The extension bundle IDs (
PacketTunnel,WireGuardTunnel,SiriIntents,HomeWidget) are derived fromAPP_BUNDLE_IDautomatically. -
In each target's Signing & Capabilities tab, select your Apple Developer team. All five app-group-sharing targets must be signed with the same team.
-
Let Xcode resolve Swift packages (File → Packages → Resolve Package Versions).
Pick a scheme, pick a device, hit ⌘R. The build_wireguard_go_bridge.sh run script builds the WireGuard-Go bridge the first time you build (and re-runs when the SDK root changes). It needs go on your PATH or it will download a toolchain to a temp dir.
| Scheme | Purpose |
|---|---|
Windscribe-Debug |
Day-to-day development, points at production API |
Windscribe-Staging |
Staging API endpoints |
Windscribe-Release |
Release build, production API |
WindscribeTV-Debug / -Staging / -Release |
tvOS equivalents |
WindscribeTests |
Unit test target (runs on iPhone 16 Pro in CI) |
HomeWidgetExtension |
Build just the widget extension |
- Packages fail to resolve → Xcode → Settings → Locations → Derived Data → delete, then File → Packages → Reset Package Caches.
- WireGuard-go build fails → install Go (
brew install go) and rebuild. The script caches by SDK root, soProduct → Clean Build Folderalso clears it. - Code signing errors on extensions → make sure every target uses the same team and that your provisioning profiles include the Network Extensions entitlement.
- Realm migration errors on first run after pulling main → delete the app from the device; schema migrations are handled at launch but only for versions we've shipped.
fastlane test # runs WindscribeTests on iPhone 16 ProOr from Xcode: select the WindscribeTests scheme and ⌘U.
swiftlint lint # or: fastlane lintConfig lives in .swiftlint.yml. Pull/merge requests are gated on lint passing.
- Fork the repo and open an issue describing the change.
- Branch off
main(feature/<slug>orfix/<slug>). - Keep commits focused; ensure lint + tests pass locally.
- Open a pull request (or merge request, if working on the GitLab source) referencing the issue.
New code follows the patterns in AGENTS.md. In short: SwiftUI + @Observable + async/await for anything new; existing UIKit/Combine/Swinject/Realm stays until it's rewritten.
Semantic Versioning — Major.Minor.Patch (BuildNumber), e.g. 3.10.1 (22) on TestFlight.
Third-party licenses: ACKNOWLEDGEMENTS.md.
License: LICENCE.md.