Go core (mihomo + sing-box + xray-core, glued by gomobile) packaged as
a Swift binary .xcframework. Consumed by the Everywhere iOS app and
the Everywhere-macOS app via Swift Package Manager.
The three core dependencies are not vendored. go/go.mod pins them
by Go-module-compatible semver; the GitHub Actions workflow at
.github/workflows/upstream-watch.yml polls the Go proxy daily and
auto-cuts a new release whenever any upstream moves.
Package.swift local binaryTarget(path:) on main, rewritten
to url+checksum on tagged releases
go/ gomobile entry package; *.go + go.mod
Scripts/build.sh gomobile bind → EverywhereCore.xcframework
.github/workflows/
upstream-watch.yml daily upstream poll + auto-release
git clone https://github.com/NodePassProject/EverywhereCore
cd EverywhereCore
Scripts/build.sh # gomobile bind, deps fetched from Go proxyProduces ./EverywhereCore.xcframework with ios-arm64,
ios-arm64_x86_64-simulator, and macos-arm64_x86_64 slices.
.package(url: "https://github.com/NodePassProject/EverywhereCore", from: "2026.05.14")The tag's Package.swift declares binaryTarget(url:, checksum:)
pointing at the GitHub Release asset; SwiftPM downloads and verifies
by SHA256.
.github/workflows/upstream-watch.yml runs daily at 08:00 UTC and on
manual workflow_dispatch. Each run:
- Queries
proxy.golang.org/<module>/@latestfor mihomo, sing-box, and xray-core (stable tags only — no pre-releases). - Compares each against the version currently pinned in
go/go.mod. - If at least one is newer (or if dispatched with
force_release: true):go geteach to its latest,go mod tidyScripts/build.shto build the xcframeworkzipthe xcframework, compute SHA256- Write a release-flavored
Package.swift(url+checksum form), commit + tagvYYYY.MM.DD - Append
.1,.2, … to the tag if multiple runs land same day - Restore the dev
Package.swifton top somainHEAD remains resolvable for in-tree consumers - Push tag + main;
gh release createwith the zip attached
- Otherwise: no-op (logged as a notice).
To bootstrap the first release after pushing this repo, run the
workflow from the Actions tab with force_release: true.
Edit go/go.mod, push to main. The next cron run will detect the
manual pin is current (or stale) and act accordingly. If you want a
release for a manual bump immediately, dispatch the workflow with
force_release: true.