Skip to content
Merged
Show file tree
Hide file tree
Changes from 76 commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
83be9ba
Add peer-share toggle to lantern-core (Share My Connection PR 3/4)
May 5, 2026
b742d9b
Wire Share My Connection toggle in Dart UI (PR 4/4)
May 5, 2026
2c44a3f
review: gate peer-proxy toggle to FFI-supported platforms
May 5, 2026
05473d6
peer-proxy: add macOS native handler
May 5, 2026
5561069
Prototype: unified Share My Connection screen with globe + SmC disclo…
May 7, 2026
ba77c8d
prototype: globe wasn't visible — restore MediaQuery override + ClipRect
May 7, 2026
e3bfff8
prototype: use SwitchButton to match the rest of the app's toggles
May 7, 2026
32402ef
prototype: nudge the globe up — alignment(0, 0.1) → (0, -0.1)
May 7, 2026
0ff7108
prototype: replace mock event timer with poll of radiance peer stats …
May 7, 2026
aa56a5e
Stream peer-connection events from radiance to Flutter via the existing
May 7, 2026
2f03640
Advanced section in Share My Connection: manual port forward setting
May 7, 2026
8f5ced9
Unbounded fully wired through to the SmC UI's "Basic mode"
May 8, 2026
566d789
macOS: wire setPeerManualPort + setUnboundedEnabled through MethodCha…
May 8, 2026
4cd8d9c
share-my-connection: toggle honors Advanced manual port before UPnP p…
May 8, 2026
0d36530
mobile: sanitize errors before returning to gomobile bridge
May 8, 2026
e51e416
share-my-connection: surface radiance peer phase events to the UI
May 11, 2026
a620404
core: instrument peer-connection subscriber to pair with radiance bre…
May 11, 2026
beb020d
core: log listenPeerConnectionEvents goroutine entry
May 11, 2026
71342de
core: consume peer events over IPC SSE instead of in-process events.S…
May 11, 2026
7dcf3d1
SmC: real per-peer geo, on-globe heart burst, arc reversal
May 12, 2026
a190859
SmC: lift heart-burst off the globe into a floating toast
May 12, 2026
50d9bf7
deps: bump radiance to #501 tip + lantern-box to #255 tip; drop local…
myleshorton May 29, 2026
ac77f75
smc: address Copilot review (5 of 7)
myleshorton May 31, 2026
281d5b7
smc: wire real UPnP / IGD probe via FFI + MethodChannel
myleshorton May 31, 2026
5258c7d
smc: i18n the 'On — tap to view' subtitle in VPN settings
myleshorton May 31, 2026
967c201
macos: wire probeUPnP MethodChannel handler
myleshorton May 31, 2026
015cc1f
mobile: wire SmC + Unbounded MethodChannel handlers for Android & iOS
myleshorton May 31, 2026
0631608
smc: address Copilot review on #8819 round-N
myleshorton Jun 1, 2026
4bb5b52
smc: tighten _extractIP for bare IPv6 + check Unbounded enable Either
myleshorton Jun 1, 2026
f7adec5
smc: render off-with-error + check SmC enable Either + cache peer geo
myleshorton Jun 1, 2026
0bcd729
smc: list-spread + dispose guards + terminal-phase reset + docs
myleshorton Jun 1, 2026
24abae2
smc: MediaQuery copyWith + symmetric wire format + drop stale fromJson
myleshorton Jun 1, 2026
690494b
smc: gate arc draws on origin coords + accurate event type doc
myleshorton Jun 1, 2026
7d03f48
smc: defer subscription cleanup + strict arg validation across handlers
myleshorton Jun 1, 2026
95c1b5a
smc: _resolveAndEmit isClosed guard + honest 'session' stat label
myleshorton Jun 1, 2026
2b553c7
smc: keep-alive ShareNotifier + reflect Unbounded in VPN tile
myleshorton Jun 1, 2026
34e64f1
smc: revise defer Unsubscribe comment to match actual lifecycle
myleshorton Jun 1, 2026
86879e6
unbounded: phase 1 — tab shell + Unbounded as a top-level tab
May 12, 2026
3ed84c3
unbounded: phase 2 — Unbounded Settings sheet + hide-tab toggle
May 12, 2026
11abe38
unbounded: phase 3 — auto-enable on VPN connect
May 12, 2026
e191f63
unbounded: phase 4 — first-visit welcome popup + info bubble
May 12, 2026
dcf42b7
unbounded: also auto-enable on app launch (not just VPN connect)
May 12, 2026
76f59cb
unbounded: lift the heart spray out of the pill, onto the globe
May 12, 2026
ec18d7f
unbounded: put the Lottie inside the pill, overflowing — matches CSS
May 12, 2026
1dfee34
unbounded: match the pill exactly — heart+text, bottom-left anchor
May 12, 2026
74a1d4b
unbounded: revert the pill back to centered
May 12, 2026
8ad21a5
unbounded: persist "Total people helped to date" across restarts
May 12, 2026
6b4cf04
share: auto-fall-back from SmC to Unbounded on any Start failure
May 13, 2026
d856624
unbounded: gate entire UI surface on server Features[unbounded] flag
May 13, 2026
f028351
share: render Lottie arrival heart-burst at native canvas size
May 14, 2026
caba92d
share: nudge heart-to-text gap from 10 → 14 px
May 14, 2026
74f58f0
smc: address Copilot review on #8820
myleshorton May 31, 2026
9024906
review: i18n the Unbounded UI + preserve totalCount on idle reset
myleshorton Jun 2, 2026
de0b5b6
review: preserve totalCount on Start error, remove dead Lottie layer,…
myleshorton Jun 2, 2026
c9fe5fa
share_my_connection: clarify peer-arrival persist invariant
myleshorton Jun 2, 2026
53c2d22
share_my_connection: roll back state if Unbounded fallback also fails
myleshorton Jun 2, 2026
b8557fe
review: honor unboundedHidden in auto-enable, drop microtask, fix act…
myleshorton Jun 2, 2026
bd61905
deps: bump radiance for the unbounded connection-source fix
myleshorton Jun 7, 2026
0bfd915
unbounded: fix globe origin — call geo /lookup + use precise coords
myleshorton Jun 7, 2026
12aca41
unbounded: route peer geo lookups through Lantern's own service
myleshorton Jun 7, 2026
e4a005e
unbounded: stop the globe burning CPU off-tab and after toggle-off
myleshorton Jun 7, 2026
c491c67
unbounded: address review — globe visibility via tab animation, dialo…
myleshorton Jun 7, 2026
8fe94b8
unbounded: make the globe static — rotate-to-arc instead of spinning
myleshorton Jun 8, 2026
8c9cdb3
Merge main into smc-unified-screen; fix duplicate pubspec key
myleshorton Aug 5, 2026
fb574f0
Merge smc-unified-screen into unbounded-tab
myleshorton Aug 5, 2026
1fadcd9
deps: bump radiance to the current smc/unbounded tip
myleshorton Aug 10, 2026
f1c7a3f
Merge main; re-pin radiance to the current smc/unbounded tip
myleshorton Aug 11, 2026
91e734c
Merge smc-unified-screen: main + current radiance pin
myleshorton Aug 11, 2026
aee40b3
unbounded: make auto-enable opt-in (default off)
myleshorton Jun 9, 2026
92cf220
smc: re-apply the globe theme whenever the inherited theme changes
myleshorton Aug 11, 2026
a9a56d7
unbounded: bring the tab and status card in line with the Figma spec
myleshorton Aug 11, 2026
88fd4e7
Merge branch 'fisk/smc-unified-screen' into fisk/unbounded-tab
myleshorton Aug 11, 2026
478b119
smc: defer the globe theme apply out of the build phase
myleshorton Aug 11, 2026
2e9e49f
Merge branch 'fisk/smc-unified-screen' into fisk/unbounded-tab
myleshorton Aug 11, 2026
49cb187
home: defer the initial tab sync, and use outline icons in the tab strip
myleshorton Aug 11, 2026
05b04d2
unbounded: match the tab and screen to the Figma desktop spec
myleshorton Aug 11, 2026
7ee0534
One consent covering both sharing modes (#8969)
myleshorton Aug 11, 2026
32aa7bc
deps: bump radiance to the merged peer-core tip
myleshorton Aug 12, 2026
08b1077
unbounded: spin the globe again on desktop
myleshorton Aug 12, 2026
c7c5898
deps: bump radiance for the peer heartbeat client count
myleshorton Aug 14, 2026
275da7d
deps: bump radiance to f59e3fe
myleshorton Aug 15, 2026
a806581
deps: bump radiance to f59e3fe
myleshorton Aug 15, 2026
5bfd921
smc: never choose the peer-proxy mode on iOS
myleshorton Aug 15, 2026
a78d27e
smc: never choose the peer-proxy mode on iOS
myleshorton Aug 16, 2026
0a8335d
Merge fisk/smc-unified-screen into fisk/unbounded-tab
myleshorton Aug 16, 2026
ebbb0de
Merge main into fisk/unbounded-tab
myleshorton Aug 16, 2026
e7ec314
unbounded: hide the Advanced card on iOS
myleshorton Aug 16, 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
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,15 @@ enum class Methods(val method: String) {
SetRoutingMode("setRoutingMode"),
IsSmartRoutingEnabled("isSmartRoutingEnabled"),

// Share My Connection (samizdat) + Unbounded (broflake) peer-share
SetPeerProxyEnabled("setPeerProxyEnabled"),
IsPeerProxyEnabled("isPeerProxyEnabled"),
SetPeerManualPort("setPeerManualPort"),
GetPeerManualPort("getPeerManualPort"),
SetUnboundedEnabled("setUnboundedEnabled"),
IsUnboundedEnabled("isUnboundedEnabled"),
ProbeUPnP("probeUPnP"),

// Telemetry
IsTelemetryEnabled("isTelemetryEnabled"),

Expand Down Expand Up @@ -1288,6 +1297,66 @@ class MethodHandler : FlutterPlugin,
}
}

// Share My Connection (samizdat) + Unbounded (broflake)
// peer-share. Phones on mobile data won't have UPnP, but
// home WiFi does — manual port forwarding works there too,
// so the whole stack is exposed on Android rather than
// desktop-only.
Methods.SetPeerProxyEnabled.method -> {
scope.handleResult(result, "set_peer_proxy_enabled") {
val enabled = call.argument<Boolean>("enabled")
?: error("Missing enabled")
Mobile.setPeerShareEnabled(enabled)
}
}

Methods.IsPeerProxyEnabled.method -> {
scope.handleValue(result, "is_peer_proxy_enabled") {
Mobile.isPeerShareEnabled()
}
}

Methods.SetPeerManualPort.method -> {
scope.handleResult(result, "set_peer_manual_port") {
// error() surfaces the failure rather than silently
// defaulting to 0 — which would clear the user's
// manual port override on caller bugs. Matches the
// SetPeerProxyEnabled pattern above.
val port = call.argument<Int>("port") ?: error("Missing port")
Mobile.setPeerManualPort(port.toLong())
}
}

Methods.GetPeerManualPort.method -> {
scope.handleValue(result, "get_peer_manual_port") {
Mobile.getPeerManualPort().toInt()
}
}

Methods.SetUnboundedEnabled.method -> {
scope.handleResult(result, "set_unbounded_enabled") {
val enabled = call.argument<Boolean>("enabled")
?: error("Missing enabled")
Mobile.setUnboundedEnabled(enabled)
}
}

Methods.IsUnboundedEnabled.method -> {
scope.handleValue(result, "is_unbounded_enabled") {
Mobile.isUnboundedEnabled()
}
}

Methods.ProbeUPnP.method -> {
// UPnP M-SEARCH waits up to ~6s on multicast replies;
// handleValue is already coroutine-backed (Dispatchers.IO
// via scope), so the wait runs off the main thread and
// doesn't block the Flutter UI isolate.
scope.handleValue(result, "probe_upnp") {
Mobile.probeUPnP()
}
}

Methods.IsTelemetryEnabled.method -> {
scope.handleValue(result, "is_telemetry_enabled") {
Mobile.isTelemetryEnabled()
Expand Down
3 changes: 3 additions & 0 deletions assets/images/unbounded.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
13 changes: 13 additions & 0 deletions assets/images/unbounded_wordmark.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading