What Apple and I both share after this is done
A transparent interface level proxy for TCP packets. This project is designed to work around the loopback limitations on iOS.
em_proxy acts as a local WireGuard server listening on loopback (127.0.0.1) that performs packet source/destination address swapping.
It leverages Cloudflare's boringtun userspace WireGuard implementation to understand WireGuard encryption, decrypting incoming UDP packets from the WireGuard VPN app and rewriting IP headers so packets appear from a non-self origin address, acting as a proxy server for loopback relay.
Building em_proxy locally requires:
- Rust & Cargo (installed via rustup)
- just task runner (
brew install just) - Xcode & Command Line Tools (for
xcodebuildandxcrun)
Install the required Apple compilation targets:
rustup target add aarch64-apple-ios
rustup target add aarch64-apple-ios-sim
rustup target add aarch64-apple-darwinGenerate the Apple XCFramework (libs/EMProxy.xcframework):
just xcframeworkOr build individual target static libraries using cargo:
cargo build --release --target aarch64-apple-iosPushes to branches (develop, main, master), pull requests, and tag pushes all trigger GitHub Actions CI to build and verify EMProxy.xcframework.zip.
Only pushing a version tag matching v*.*.* will generate and publish a GitHub Release with EMProxy.xcframework.zip, ready for use in Swift Package Manager via .binaryTarget:
.binaryTarget(
name: "EMProxyFFI",
url: "https://github.com/SideStore/em_proxy/releases/download/v0.1.0/EMProxy.xcframework.zip",
checksum: "<sha256-checksum>"
)To publish a release:
- Push a version tag matching
v*.*.*(e.g.v0.1.0):
git tag v0.1.0
git push origin v0.1.0Note: Updating or force-pushing tags is only allowed for the latest release. Correcting or updating tags for any releases prior to the last release is disallowed and will trigger a build error.