Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
120 commits
Select commit Hold shift + click to select a range
8d8ea41
ci: add TestFlight workflow for self-hosted Mac runner
claude May 9, 2026
7afa733
ci: re-trigger TestFlight workflow after secrets provisioning
claude May 9, 2026
09e03cf
ci: drop paths-ignore so empty/doc-only commits also trigger TestFlight
claude May 9, 2026
f4a83b8
ci: capture xcodebuild logs and upload as build-logs artifact
claude May 9, 2026
89cb1e6
chore: rename bundle id from com.netlab.TurnBridge to com.truvvor.tur…
claude May 9, 2026
579cc83
ci: re-run TestFlight workflow after App Group registration
claude May 10, 2026
fb69bfb
ci: unlock login keychain and set partition list before signing
claude May 10, 2026
b2809dc
ci: re-run TestFlight workflow after MAC_KEYCHAIN_PASSWORD secret added
claude May 10, 2026
446a4f0
ci: make keychain-unlock step robust and self-diagnostic
claude May 10, 2026
31802a6
ci: re-run TestFlight workflow with new ASC API key (cloud distribution)
claude May 10, 2026
9f0bef1
ci: provision Distribution cert/profiles via ASC API and use manual e…
claude May 10, 2026
91ffb84
ci: drop fastlane/spaceship dependency in signing setup
claude May 10, 2026
fca14f9
ci: prefer existing keychain Distribution cert and pin its SHA-1 in e…
claude May 10, 2026
4010d62
ci: re-run TestFlight workflow now that the App Store record exists
claude May 10, 2026
cf6158a
chore: declare ITSAppUsesNonExemptEncryption=NO so TestFlight skips t…
claude May 10, 2026
18f9907
feat: opt-in manual captcha mode that hands the VK challenge to the user
claude May 11, 2026
bace9be
fix(captcha): import Combine in the new manager/web view
claude May 11, 2026
bee61df
fix(captcha): give the WebView size, log lifecycle, surface failures
claude May 11, 2026
c48c3bf
fix(captcha): drop includeAllNetworks while manual captcha is enabled
claude May 11, 2026
6f1b2be
fix(captcha): give DTLS 5 min, not 12s, while manual captcha is on
claude May 11, 2026
5a621bd
fix(turn): keep DTLS/TURN alive across backgrounding and network changes
claude May 12, 2026
60c6cba
fix(tunnel): don't restart on cellular PDP flaps
claude May 12, 2026
96d6c51
ci: defensive Swift in NWPath handler to unblock archive
claude May 12, 2026
3f6fcd6
fix(tunnel): disambiguate NWPath as Network.NWPath
claude May 12, 2026
e0df259
feat(turn_proxy): log DTLS and TURN session lifetimes on exit
May 12, 2026
e61b90f
feat(turn_proxy): exponential backoff with jitter on reconnect
May 12, 2026
a5c8bde
fix(turn_proxy): stop overriding TURN port with hardcoded 19302
May 12, 2026
250b51d
feat: proactive TURN/DTLS reconnect on iOS wake (P1)
May 12, 2026
e355de6
feat: make TURN transport (UDP/TCP) configurable per profile (P2)
May 12, 2026
6300a5a
feat(turn_proxy): app-level DTLS keepalive every 5s (P5)
May 12, 2026
32c6559
Merge branch 'main' into claude/build-project-br5tJ
truvvor May 12, 2026
a62f199
Merge pull request #1 from truvvor/claude/build-project-br5tJ
truvvor May 12, 2026
ef381cd
fix(turn_proxy): RestartProxy delegates to ProxyForceReconnect
claude May 12, 2026
e9a8738
fix(wireguard.h): expose 5-arg StartProxy and ProxyForceReconnect
claude May 12, 2026
5cfa1ce
debug: expose data-plane byte counters at every layer of the tunnel
claude May 12, 2026
3b9c1d1
fix(tunnel): logRouteScope reads AllowedIPs + UserDefaults manualCaptcha
claude May 12, 2026
377b569
perf(turn_proxy): bump UDP socket buffers to 4 MB on both wire sockets
claude May 12, 2026
38c2c66
ui: stop flashing the "unstable" banner during normal wake reconnects
claude May 12, 2026
a981ec7
fix(turn_proxy): fan-out shared listenConn so nValue>1 actually paral…
claude May 14, 2026
ca8b19f
fix(turn_proxy): defer proxyReady until ALL N captchas are solved
claude May 14, 2026
185ca1a
fix(identity): pretend to be iPhone Safari, not desktop Chrome
claude May 14, 2026
e965eda
fix(captcha_slider): support rectangular tile grids (e.g. 3×7 word-st…
claude May 14, 2026
1bea7e0
fix(tunnel): scale ProxyWaitReady timeout by N (was hardcoded to 12s)
claude May 14, 2026
d917a0e
feat: parallelise N captcha solves + silence per-tick byte spam + res…
claude May 14, 2026
e3e17b2
feat(settings): raise N cap 16→100 and allow manual numeric entry
claude May 14, 2026
283de35
feat: port kiper292 17-byte Session-ID stream-aggregation handshake
claude May 14, 2026
3736253
fix(turn_proxy): throttle parallel captcha solves to 5+jitter
claude May 14, 2026
f309f42
feat(captcha): trap unsolved captchas to App Group container
claude May 14, 2026
e04c020
feat: phased bring-up with dual-egress captcha solves and live UI cou…
claude May 14, 2026
69ed604
Merge pull request #2 from truvvor/claude/build-project-br5tJ
truvvor May 14, 2026
0cbc9d6
feat: drain direct egress first + always-on stats badge + captcha viewer
claude May 14, 2026
53b339f
Merge pull request #3 from truvvor/claude/build-project-br5tJ
truvvor May 14, 2026
82b5559
debug(captcha-trap): write probe file + show full diagnostics in viewer
claude May 14, 2026
14ff5a0
Merge pull request #4 from truvvor/claude/build-project-br5tJ
truvvor May 14, 2026
dc3d2f1
fix(dns): DoH+hardcoded fallback for login.vk.ru/api.vk.ru/id.vk.ru
claude May 14, 2026
5861171
Merge pull request #5 from truvvor/claude/build-project-br5tJ
truvvor May 14, 2026
fb8d9a6
fix(captcha-trap): only commit entries with an actual image
claude May 14, 2026
cea651b
Merge pull request #6 from truvvor/claude/build-project-br5tJ
truvvor May 14, 2026
e0dfced
feat: live counters, force-disconnect, ctx plumbing, visible captchas
claude May 14, 2026
58ebbd6
Merge pull request #7 from truvvor/claude/build-project-br5tJ
truvvor May 14, 2026
98ab108
fix(ui): long-press force-disconnect no longer blocked by .disabled
claude May 14, 2026
6af2cfc
Merge pull request #8 from truvvor/claude/build-project-br5tJ
truvvor May 14, 2026
157e087
feat(vk): switch all API endpoints from vk.ru to vk.com
claude May 14, 2026
b37e386
Merge pull request #9 from truvvor/claude/build-project-br5tJ
truvvor May 14, 2026
c876ed5
fix(routing): disable includeAllNetworks for auto mode too
claude May 14, 2026
c47e211
Merge pull request #10 from truvvor/claude/build-project-br5tJ
truvvor May 14, 2026
076a13a
fix(startproxy): fire proxyReady on first session ready, not after Ph…
claude May 14, 2026
49b663b
Merge pull request #11 from truvvor/claude/build-project-br5tJ
truvvor May 14, 2026
8424acc
fix(captcha-slider): cap concurrent rankings to 2 to avoid iOS OOM
claude May 14, 2026
d6e3b78
Merge pull request #12 from truvvor/claude/build-project-br5tJ
truvvor May 14, 2026
5fcd821
fix(captcha): cap reconnect-driven retry storm + retry direct after c…
claude May 14, 2026
b5ff9a2
perf(creds): refuse to recycle TURN identities older than 45s (F2)
claude May 14, 2026
2c22c12
perf(creds): reuse one HTTP client across all auth requests (F4)
claude May 14, 2026
95f0daf
perf(captcha): move anti-bot jitter out of the solveSlot semaphore (F3)
claude May 14, 2026
c8ea204
perf(startproxy): drop spawn stagger from 400ms/800ms to 100ms/200ms …
claude May 14, 2026
a3c2fee
perf(slider): score candidates without materialising the rearranged i…
claude May 14, 2026
4d7a434
chore: ignore local `go build .` binary artifact
claude May 14, 2026
78a6bb9
chore(version): bump MARKETING_VERSION 1.2.6 → 1.2.7
claude May 15, 2026
6eafd19
feat(captcha-service): server-side VK captcha + identity pipeline
claude May 15, 2026
2c0b15a
feat(client): opt-in offload of getCreds to remote captcha-service
claude May 15, 2026
6b55e00
chore(ci): force rebuild for remote-captcha-service test
claude May 15, 2026
7bda3e3
feat(captcha-service): peer-to-peer fan-out (V2)
claude May 15, 2026
b918ca3
feat(remote-captcha): client-side cooldown on 429 from master
claude May 15, 2026
29b2d56
fix(wake): skip reconnect on short suspends (<30s) + earlier remote h…
claude May 15, 2026
b375e44
perf(fanout): shortest-queue-first dispatcher for better aggregation
claude May 15, 2026
2d8ae48
obs(memory): log Go heap + iOS process budget every 5s
claude May 15, 2026
df46325
fix(memory): hard-cap N at 40 in StartProxy
claude May 15, 2026
a43dd73
fix(memory): plug 4 goroutine leaks identified by code-review audit
claude May 15, 2026
9239daf
feat(links): multi-link round-robin in StartProxy + multi-line UI
claude May 15, 2026
485d646
feat(ui): surface server-side captcha solves alongside Direct/Tunnel
claude May 16, 2026
ba92020
perf(memory): reduce fanout queue depth 256 → 64
claude May 16, 2026
133fc4d
perf(memory): bounded packet pipe + pooled read scratches
claude May 16, 2026
0957df8
perf(memory): minimal TURN client + raise N cap 40→100
claude May 16, 2026
6994ba1
revert: disable minimal TURN client (auth bug)
claude May 16, 2026
d178981
perf(memory): Go runtime soft cap + aggressive GC + periodic FreeOSMe…
claude May 16, 2026
2ea46d4
fix(turn-min): write magic cookie before computing MESSAGE-INTEGRITY …
claude May 16, 2026
ae7388e
fix(watchdog): don't cull idle-but-healthy sessions
claude May 16, 2026
c171226
fix(startup): parse literal peer IP:port without system resolver
claude May 31, 2026
c26fe0a
fix(addr): strip Unicode whitespace from peer/listen address
claude May 31, 2026
1a7c9cf
feat(captcha): impersonate Safari iOS at TLS+HTTP/2 via tls-client
claude Jun 9, 2026
13b9f5d
feat(captcha-service): Safari iOS TLS fingerprint + WARP egress
claude Jun 9, 2026
015694f
feat(captcha): v2 algorithm — dynamic debug_info, slim device, show-t…
claude Jun 9, 2026
978a9b9
feat(wrap): SRTP/Opus mimicry layer (port of Moroka8 wrap.go)
claude Jun 9, 2026
8b13d4e
fix(ci): generate wrap key in Swift via SecRandomCopyBytes
claude Jun 9, 2026
77d5513
fix(settings): route wrap-key generation through the draft binding
claude Jun 9, 2026
4f8c388
feat(captcha): manual-fallback solve mode
claude Jun 9, 2026
f173bb6
fix(ci): missed manualCaptchaEnabled refs in DTLS budget path
claude Jun 9, 2026
ff91ba0
fix(captcha): make WKWebView look like Mobile Safari
claude Jun 9, 2026
423484c
feat(captcha): in-WebView API replay so VK sees one coherent session
claude Jun 9, 2026
7a58027
fix(captcha): rescue stuck WebView states + add terminal-page detection
claude Jun 9, 2026
0dd848d
fix(captcha): cap manual prompts at 5 per StartProxy session
claude Jun 9, 2026
f0462ee
fix(captcha): Cancel button always works + XHR addEventListener hook
claude Jun 9, 2026
8533aba
fix(captcha): serialise manual prompts so sheets don't race
claude Jun 9, 2026
e7bf42b
chore: bump version to 1.3.28
claude Jun 9, 2026
21959d5
fix(captcha): hard cap user-facing prompts at 3, defer rest to remote
claude Jun 9, 2026
25180c6
fix(captcha): tear down captcha sheet when tunnel stops
claude Jun 9, 2026
e1e43b0
Merge pull request #13 from truvvor/claude/build-project-br5tJ
truvvor Jun 9, 2026
b75117e
fix(captcha): harden manual path for bootstrap sessions
Jun 9, 2026
1d0cd5f
feat(captcha): log VK NotRobot verdict in WebView (forced-mode diagno…
Jun 9, 2026
e79f46b
fix(captcha): suppress unsolvable second manual sheet (per-IP cooldown)
Jun 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 83 additions & 0 deletions .github/workflows/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# CI: Build & TestFlight

Workflow `testflight.yml` archives the iOS app on the self-hosted
`Mac-mini-GK` runner (`self-hosted`, `macOS`, `ARM64`) and uploads the build
to TestFlight via the App Store Connect API.

## One-time setup

### 1. Apple Developer / App Store Connect

1. In **Apple Developer → Certificates, Identifiers & Profiles**, register
both bundle IDs and enable the required capabilities:
- `com.netlab.TurnBridge` — App Groups (`group.com.netlab.TurnBridge`),
Network Extensions.
- `com.netlab.TurnBridge.network-extension` — App Groups
(`group.com.netlab.TurnBridge`), Network Extensions
(Packet Tunnel Provider).
2. In **App Store Connect → My Apps**, create the app record for
`com.netlab.TurnBridge` (needed before the first TestFlight upload).
3. In **App Store Connect → Users and Access → Integrations → App Store
Connect API**, create an API key with the **App Manager** role. Save the
downloaded `.p8` file — it is shown only once.

### 2. Self-hosted runner (Mac-mini-GK)

Make sure the runner has:

- Xcode (matching the project's deployment target, iOS 16.6+) installed and
selected: `sudo xcode-select -s /Applications/Xcode.app`.
- Command line tools and a logged-in Apple ID in Xcode is **not** required —
signing is driven by the App Store Connect API key.
- Homebrew + Go (`brew install go`) — the `WireGuardKitGo` build phase needs
it. The script looks in `/opt/homebrew/bin`.
- The runner user must be able to access the login keychain non-interactively
(no password prompt). If Xcode prompts for the keychain on first run,
unlock it once manually or store the password with `security
set-key-partition-list`.

### 3. GitHub repository secrets

In `truvvor/turnbridge` → **Settings → Secrets and variables → Actions**, add:

| Secret | Value |
| -------------------- | ------------------------------------------------------------- |
| `APPLE_TEAM_ID` | 10-character Team ID (e.g. `ABCDE12345`) |
| `ASC_ISSUER_ID` | Issuer ID UUID from App Store Connect → Integrations |
| `ASC_KEY_ID` | 10-character Key ID from the same page |
| `ASC_KEY_P8_BASE64` | `base64 -i AuthKey_<KEY_ID>.p8` output (single line, no wrap) |

On macOS, generate the base64 secret with:

```bash
base64 -i AuthKey_XXXXXXXXXX.p8 | pbcopy
```

## Triggering

- Manually: **Actions → Build & TestFlight → Run workflow**, choose `upload`
to send to TestFlight or `build-only` to just produce the IPA artifact.
- Automatically: every push to `claude/build-project-br5tJ` (excluding doc /
asset only changes) runs the workflow and uploads.

## Build number

`CFBundleVersion` is overridden to `100 + GITHUB_RUN_NUMBER` so each run is
strictly higher than the previous one. To raise the floor (e.g. after
manually uploading some builds outside CI), set repo variable
`TESTFLIGHT_BUILD_BASE` to a larger number.

`MARKETING_VERSION` (1.2.6 today) stays as committed in
`TurnBridge.xcodeproj/project.pbxproj` — bump it there when releasing a new
TestFlight version family.

## Notes

- Code signing uses Xcode automatic signing with `-allowProvisioningUpdates`
+ the App Store Connect API key. The ASC API key is enough — no `.p12`
cert or provisioning profile secrets needed.
- `ENABLE_USER_SCRIPT_SANDBOXING=NO` is passed at archive time because the
WireGuardKitGo build phase writes outside of its declared inputs/outputs.
- The IPA is also published as a workflow artifact (`TurnBridge-ipa`) so you
can download an unsigned-for-AppStore copy without re-running the upload
step.
Loading