# tsnet_flutter Embed [Tailscale's tsnet](https://pkg.go.dev/tailscale.com/tsnet) in Flutter apps. Provides a userspace WireGuard tunnel with a localhost TCP proxy — **no VPN entitlement needed** on iOS. ## How it works ``` Flutter (Dart) → MethodChannel → Swift Plugin → Go static library (tsnet) ↓ WireGuard tunnel (userspace) ↓ Remote device (100.x.x.x) ``` The Go layer runs a local TCP proxy: your app connects to `localhost:PORT`, and traffic is forwarded through a WireGuard tunnel to the target device's Tailscale IP. Flutter doesn't know about Tailscale — it just sees a localhost port. ## Usage ```dart import 'package:tsnet_flutter/tsnet_flutter.dart'; final tsnet = TsnetFlutter(); // Join the Tailnet await tsnet.start(authKey: 'tskey-auth-...'); // Create a local proxy to the remote device final localPort = await tsnet.startProxy('100.64.0.5', port: 5050); // Connect your client to the proxy yourClient.connect('127.0.0.1', port: localPort); // Clean up await tsnet.stopProxy(); await tsnet.stop(); ``` ## Platform support | Platform | Status | Min version | |----------|--------|-------------| | iOS | Supported (arm64 device + simulator) | 14.0 | | macOS | Supported (arm64 + x86_64 universal) | 12.0 | | Android | Planned | — | ## Platform setup ### iOS No special entitlements or permissions needed. No VPN entitlement required. ### macOS macOS apps run sandboxed. Add these entitlements to both `DebugProfile.entitlements` and `Release.entitlements`: ```xml com.apple.security.network.client com.apple.security.network.server ``` `network.client` allows the app to connect to the localhost proxy and external networks. `network.server` allows the Go layer to open a localhost listener for the proxy. ## Requirements - Tailscale auth key (generate at [login.tailscale.com](https://login.tailscale.com/admin/settings/keys)) ## Building from source The pre-built xcframeworks are included in the package. To rebuild from Go source: ```bash # Prerequisites: Go 1.23+, Xcode with iOS + macOS SDKs ./build_go.sh # build all platforms ./build_go.sh ios # iOS only ./build_go.sh macos # macOS only ``` ## License BSD-3-Clause. See [LICENSE](LICENSE).