Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
a873aaf
Check in-flight in app purchase (#8732)
jigar-f May 6, 2026
5fb029d
bump radiance to main + transitive bumps from go mod tidy (#8734)
myleshorton May 6, 2026
b106b8e
bump radiance to 4445a20 (legacy YAML migration) (#8735)
myleshorton May 6, 2026
3a2cc71
Prototype: unified Share My Connection screen with globe + SmC disclo…
May 7, 2026
484c598
bump lantern-box - reselect on failure fix (#8738)
garmr-ulfr May 7, 2026
ddac3aa
Add screenshot attachments to issue reports
atavism May 7, 2026
65c5eaa
prototype: globe wasn't visible — restore MediaQuery override + ClipRect
May 7, 2026
89ce992
prototype: use SwitchButton to match the rest of the app's toggles
May 7, 2026
49683f3
prototype: nudge the globe up — alignment(0, 0.1) → (0, -0.1)
May 7, 2026
b495fef
prototype: replace mock event timer with poll of radiance peer stats …
May 7, 2026
0a1ae41
Stream peer-connection events from radiance to Flutter via the existing
May 7, 2026
621165f
Advanced section in Share My Connection: manual port forward setting
May 7, 2026
c4543f7
pull in vpn performance tunning (#8739)
garmr-ulfr May 7, 2026
fb9dca0
Unbounded fully wired through to the SmC UI's "Basic mode"
May 8, 2026
0a6add5
macOS: wire setPeerManualPort + setUnboundedEnabled through MethodCha…
May 8, 2026
c9ad1dd
share-my-connection: toggle honors Advanced manual port before UPnP p…
May 8, 2026
2d3f800
send idempotency keys with redirect checkout (#8736)
atavism May 8, 2026
dcabbcd
mobile: sanitize errors before returning to gomobile bridge
May 8, 2026
6d17c0c
share-my-connection: surface radiance peer phase events to the UI
May 11, 2026
9c6be0a
bump radiance and lantern-box (#8744)
garmr-ulfr May 11, 2026
f482218
core: instrument peer-connection subscriber to pair with radiance bre…
May 11, 2026
a06d6c9
core: log listenPeerConnectionEvents goroutine entry
May 11, 2026
05b2a2d
core: consume peer events over IPC SSE instead of in-process events.S…
May 11, 2026
5291b41
tidy go.mod for samizdat + lantern-box bumps
May 12, 2026
e5c2da1
SmC: real per-peer geo, on-globe heart burst, arc reversal
May 12, 2026
c644cc8
macos: cache installed system-extension hashes + skip uninstalling bu…
myleshorton May 12, 2026
f5d56f6
SmC: lift heart-burst off the globe into a floating toast
May 12, 2026
e809ef6
Merge main into fisk/share-my-connection-ux
May 12, 2026
eee1c0a
unbounded: phase 1 — tab shell + Unbounded as a top-level tab
May 12, 2026
a57be0d
unbounded: phase 2 — Unbounded Settings sheet + hide-tab toggle
May 12, 2026
586b1a8
unbounded: phase 3 — auto-enable on VPN connect
May 12, 2026
ea77979
unbounded: phase 4 — first-visit welcome popup + info bubble
May 12, 2026
0dcb4da
unbounded: also auto-enable on app launch (not just VPN connect)
May 12, 2026
4f5e164
unbounded: lift the heart spray out of the pill, onto the globe
May 12, 2026
05b8c31
unbounded: put the Lottie inside the pill, overflowing — matches CSS
May 12, 2026
c1e8f8a
unbounded: match the pill exactly — heart+text, bottom-left anchor
May 12, 2026
3fa70eb
unbounded: revert the pill back to centered
May 12, 2026
1d8d933
unbounded: persist "Total people helped to date" across restarts
May 12, 2026
6236309
share: auto-fall-back from SmC to Unbounded on any Start failure
May 13, 2026
8f826ab
unbounded: gate entire UI surface on server Features[unbounded] flag
May 13, 2026
a6b8482
share: render Lottie arrival heart-burst at native canvas size
May 14, 2026
a4843dd
share: nudge heart-to-text gap from 10 → 14 px
May 14, 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 @@ -387,13 +387,15 @@ class MethodHandler : FlutterPlugin,
val device = map["device"] as String? ?: ""
val model = map["model"] as String? ?: ""
val logFilePath = map["logFilePath"] as String? ?: ""
val attachmentsJson = reportIssueAttachmentsJson(map["attachments"])
Mobile.reportIssue(
email,
issueType,
description,
device,
model,
logFilePath
logFilePath,
attachmentsJson
)
withContext(Dispatchers.Main) {
success("ok")
Expand Down Expand Up @@ -467,10 +469,15 @@ class MethodHandler : FlutterPlugin,
scope.launch {
result.runCatching {
val map = call.arguments as Map<*, *>
val idempotencyKey = map["idempotencyKey"] as? String
if (idempotencyKey.isNullOrBlank()) {
throw IllegalArgumentException("Payment redirect idempotency key is required")
}
val url = Mobile.paymentRedirect(
map["provider"] as String,
map["planId"] as String,
map["email"] as String
map["email"] as String,
idempotencyKey
)
withContext(Dispatchers.Main) {
success(url)
Expand Down Expand Up @@ -1325,6 +1332,21 @@ private fun writeAppIconToCache(ctx: Context, packageName: String): String {
return file.absolutePath
}

private fun reportIssueAttachmentsJson(raw: Any?): String {
val attachments = raw as? List<*> ?: emptyList<Any?>()
val arr = JSONArray()
attachments.forEach { item ->
val attachment = item as? Map<*, *> ?: return@forEach
arr.put(JSONObject().apply {
put("name", attachment["name"] as? String ?: "")
put("path", attachment["path"] as? String ?: "")
put("mimeType", attachment["mimeType"] as? String ?: "")
put("sizeBytes", (attachment["sizeBytes"] as? Number)?.toLong() ?: 0L)
})
}
return arr.toString()
}

private fun drawableToBitmap(drawable: Drawable): Bitmap {
if (drawable is BitmapDrawable && drawable.bitmap != null) return drawable.bitmap
val w = drawable.intrinsicWidth.coerceAtLeast(1)
Expand Down
24 changes: 24 additions & 0 deletions assets/locales/en.po
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,30 @@ msgstr "Settings"
msgid "report_an_issue"
msgstr "Report an Issue"

msgid "report_issue_add_screenshots"
msgstr "Add screenshots"

msgid "report_issue_screenshot_helper"
msgstr "PNG, JPG, or GIF — 15 MB max total"

msgid "report_issue_add_images"
msgstr "Add images"

msgid "report_issue_attachments_unsupported_type"
msgstr "Only PNG, JPG, and GIF images are supported."

msgid "report_issue_attachments_too_many"
msgstr "You can attach up to 3 images."

msgid "report_issue_attachments_total_size_exceeded"
msgstr "Attachments must stay under 15 MB total."

msgid "report_issue_attachments_duplicate"
msgstr "That image is already attached."

msgid "report_issue_attachments_unreadable"
msgstr "We could not read one of those files."

msgid "lantern_projects"
msgstr "Lantern Projects:"

Expand Down
1 change: 1 addition & 0 deletions assets/unbounded/explosion.json

Large diffs are not rendered by default.

Binary file added assets/unbounded/uv-map-dark.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/unbounded/uv-map.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 14 additions & 6 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,15 @@ module github.com/getlantern/lantern

go 1.26.2

// replace github.com/getlantern/radiance => ../radiance
// Local while SmC peer-connection events are in flight on
// fisk/peer-connection-events; remove once radiance tags a release
// that includes that work.
replace github.com/getlantern/radiance => ../radiance

// Local while samizdat real-RemoteAddr fix is in flight on
// fisk/peer-connection-listener; remove once lantern-box tags a
// release with the samizdat#10 bump.
replace github.com/getlantern/lantern-box => ../lantern-box

// replace github.com/getlantern/lantern-server-provisioner => ../lantern-server-provisioner

Expand All @@ -25,7 +33,7 @@ replace github.com/quic-go/qpack => github.com/quic-go/qpack v0.5.1
require (
github.com/alecthomas/assert/v2 v2.3.0
github.com/getlantern/lantern-server-provisioner v0.0.0-20251031121934-8ea031fccfa9
github.com/getlantern/radiance v0.0.0-20260505225642-d5a07503a0c6
github.com/getlantern/radiance v0.0.0-20260511200900-51be53e10add
github.com/sagernet/sing-box v1.12.22
golang.org/x/mobile v0.0.0-20250711185624-d5bb5ecc55c0
golang.org/x/sys v0.41.0
Expand Down Expand Up @@ -166,18 +174,18 @@ require (
github.com/gaukas/wazerofs v0.1.0 // indirect
github.com/getlantern/algeneva v0.0.0-20250307163401-1824e7b54f52 // indirect
github.com/getlantern/amp v0.0.0-20260305201851-782bc8045e58 // indirect
github.com/getlantern/broflake v0.0.0-20260501210609-ce5f75aa2054 // indirect
github.com/getlantern/broflake v0.0.0-20260504215251-ed3cf75062d1 // indirect
github.com/getlantern/common v1.2.1-0.20260326210434-cb69537aaf46 // indirect
github.com/getlantern/dnstt v0.0.0-20260112160750-05100563bd0d // indirect
github.com/getlantern/domainfront v0.0.0-20260419161617-0bff0b2169f4 // indirect
github.com/getlantern/keepcurrent v0.0.0-20260422161259-54a4d9a93694 // indirect
github.com/getlantern/kindling v0.0.0-20260428171407-6143132aaf40 // indirect
github.com/getlantern/lantern-box v0.0.77 // indirect
github.com/getlantern/kindling v0.0.0-20260507163327-92a44d03bdc5 // indirect
github.com/getlantern/lantern-box v0.0.82 // indirect
github.com/getlantern/lantern-water v0.0.0-20260317143726-e0ee64a11d90 // indirect
github.com/getlantern/osversion v0.0.0-20240418205916-2e84a4a4e175 // indirect
github.com/getlantern/pluriconfig v0.0.0-20251126214241-8cc8bc561535 // indirect
github.com/getlantern/publicip v0.0.0-20260328175246-2c460fe80c6b // indirect
github.com/getlantern/samizdat v0.0.3-0.20260327203406-ef7323341974 // indirect
github.com/getlantern/samizdat v0.0.3-0.20260511220916-bbb8ba1a28db // indirect
github.com/getlantern/semconv v0.0.0-20260327040646-21845dda05cb // indirect
github.com/getlantern/timezone v0.0.0-20210901200113-3f9de9d360c9 // indirect
github.com/go-json-experiment/json v0.0.0-20250103232110-6a9a0fde9288 // indirect
Expand Down
16 changes: 6 additions & 10 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -225,8 +225,8 @@ github.com/getlantern/algeneva v0.0.0-20250307163401-1824e7b54f52 h1:w2/RqYPw7Pb
github.com/getlantern/algeneva v0.0.0-20250307163401-1824e7b54f52/go.mod h1:PrNR8tMXO26YNs8K9653XCUH7u2Kv4OdfFC3Ke1GsX0=
github.com/getlantern/amp v0.0.0-20260305201851-782bc8045e58 h1:3wxMKw90adxiEzsJmAmMHqBJQr/P/9Goqy/U2a1l/sg=
github.com/getlantern/amp v0.0.0-20260305201851-782bc8045e58/go.mod h1:p6WdG48YAz5SCUpiMSGLy616A6YghKToc63y3NP7avI=
github.com/getlantern/broflake v0.0.0-20260501210609-ce5f75aa2054 h1:nrRMiRRjzR43yihrVxdnmmt66ZqjRhHE73TyHW1ySgg=
github.com/getlantern/broflake v0.0.0-20260501210609-ce5f75aa2054/go.mod h1:bZGGfTwne9NIsy3Kc1avcXNWn/yA8ghUwlXdS2z+AlA=
github.com/getlantern/broflake v0.0.0-20260504215251-ed3cf75062d1 h1:3WYvObOo8gpKwjcLrV6O/vRp+ubKdjpvJwZrRkbbDWw=
github.com/getlantern/broflake v0.0.0-20260504215251-ed3cf75062d1/go.mod h1:bZGGfTwne9NIsy3Kc1avcXNWn/yA8ghUwlXdS2z+AlA=
github.com/getlantern/common v1.2.1-0.20260326210434-cb69537aaf46 h1:Ab2esudqgFz2K1WYQKtX+58kaiVMX0UohjW2XmdEgf4=
github.com/getlantern/common v1.2.1-0.20260326210434-cb69537aaf46/go.mod h1:eSSuV4bMPgQJnczBw+KWWqWNo1itzmVxC++qUBPRTt0=
github.com/getlantern/context v0.0.0-20220418194847-3d5e7a086201 h1:oEZYEpZo28Wdx+5FZo4aU7JFXu0WG/4wJWese5reQSA=
Expand All @@ -245,10 +245,8 @@ github.com/getlantern/hidden v0.0.0-20220104173330-f221c5a24770 h1:cSrD9ryDfTV2y
github.com/getlantern/hidden v0.0.0-20220104173330-f221c5a24770/go.mod h1:GOQsoDnEHl6ZmNIL+5uVo+JWRFWozMEp18Izcb++H+A=
github.com/getlantern/keepcurrent v0.0.0-20260422161259-54a4d9a93694 h1:iLWm6S/47Hfk7FjW6yaD+1h6kO7C/iauV0DkVia/bXU=
github.com/getlantern/keepcurrent v0.0.0-20260422161259-54a4d9a93694/go.mod h1:ag5g9aWUw2FJcX5RVRpJ9EBQBy5yJuy2WXDouIn/m4w=
github.com/getlantern/kindling v0.0.0-20260428171407-6143132aaf40 h1:P5pkaBGxWOGBn7bKzjzdln/ro+ShG1RUbOuy+7pSzXE=
github.com/getlantern/kindling v0.0.0-20260428171407-6143132aaf40/go.mod h1:TGTxpoNVwc8Be4qkBNtf5oj2psJaEIZEq47GOPS7zkA=
github.com/getlantern/lantern-box v0.0.77 h1:2b2TyrPXYHzIx1aPUvpE//AxoW0TMl/EF/bQHaZyfqw=
github.com/getlantern/lantern-box v0.0.77/go.mod h1:YV6+5bOdvw9rmc0cJoOTP7UaFt/6XWVOierv7KcfAkY=
github.com/getlantern/kindling v0.0.0-20260507163327-92a44d03bdc5 h1:ukTEQ2S16zMK2BJxIM0qKz+WiiyiPwvmLCWlK1EOvVU=
github.com/getlantern/kindling v0.0.0-20260507163327-92a44d03bdc5/go.mod h1:TGTxpoNVwc8Be4qkBNtf5oj2psJaEIZEq47GOPS7zkA=
github.com/getlantern/lantern-server-provisioner v0.0.0-20251031121934-8ea031fccfa9 h1:6seyD2f9tz2am0YQd/Qn+q7LFiiQgnmxgwWFnVceGZw=
github.com/getlantern/lantern-server-provisioner v0.0.0-20251031121934-8ea031fccfa9/go.mod h1:s0VKrlJf/z+M0U8IKHFL2hfuflocRw3SINmMacrTlMA=
github.com/getlantern/lantern-water v0.0.0-20260317143726-e0ee64a11d90 h1:P9JX1yAu2uq3b5YiT0sLtHkTrkZuttV8gPZh81nUuag=
Expand All @@ -261,10 +259,8 @@ github.com/getlantern/pluriconfig v0.0.0-20251126214241-8cc8bc561535 h1:rtDmW8YL
github.com/getlantern/pluriconfig v0.0.0-20251126214241-8cc8bc561535/go.mod h1:WKJEdjMOD4IuTRYwjQHjT4bmqDl5J82RShMLxPAvi0Q=
github.com/getlantern/publicip v0.0.0-20260328175246-2c460fe80c6b h1:gMYJzEhLrmIqQ+JnjiYNm+UyUDalK3WUmVyecFwmV5g=
github.com/getlantern/publicip v0.0.0-20260328175246-2c460fe80c6b/go.mod h1:NpfXdK4ldEKkjQ4P1R+DBF4ua5VFOlxmgHROTnYrApg=
github.com/getlantern/radiance v0.0.0-20260505225642-d5a07503a0c6 h1:oKaQ8YQUvH7k5PZroVrO3k+4oaJqpuQzF8TsVAs0f2s=
github.com/getlantern/radiance v0.0.0-20260505225642-d5a07503a0c6/go.mod h1:Kkc9lIYGWtWjyjjsExFhUpTOkOj22IJrGXTPYW2r/kQ=
github.com/getlantern/samizdat v0.0.3-0.20260327203406-ef7323341974 h1:k+/qNo5YNO+8M8LVUp6G5Evm1OQdEs3Z4ye8top4AhI=
github.com/getlantern/samizdat v0.0.3-0.20260327203406-ef7323341974/go.mod h1:uEeykQSW2/6rTjfPlj3MTTo59poSHXfAHTGgzYDkbr0=
github.com/getlantern/samizdat v0.0.3-0.20260511220916-bbb8ba1a28db h1:2gV2u8cnjgmXRZHdVk7/amuo+PzboBqZxuWwwMIALsY=
github.com/getlantern/samizdat v0.0.3-0.20260511220916-bbb8ba1a28db/go.mod h1:uEeykQSW2/6rTjfPlj3MTTo59poSHXfAHTGgzYDkbr0=
github.com/getlantern/semconv v0.0.0-20260327040646-21845dda05cb h1:c5YM7b3a4r2J8Eh89KkI6M/iTFe6Bi+b8AJlfkKdFq4=
github.com/getlantern/semconv v0.0.0-20260327040646-21845dda05cb/go.mod h1:GkPT5P9JoOTIRXRmFWxYgu1hhXgTFFTNc2hoG7WQc3g=
github.com/getlantern/sing v0.7.18-lantern h1:QKGgIUA3LwmKYP/7JlQTRkxj9jnP4cX2Q/B+nd8XEjo=
Expand Down
23 changes: 22 additions & 1 deletion ios/Runner/Handlers/MethodHandler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1006,9 +1006,20 @@ class MethodHandler {
let device = data["device"] as? String ?? ""
let model = data["model"] as? String ?? ""
let logFilePath = data["logFilePath"] as? String ?? ""
let attachments = data["attachments"] as? [[String: Any]] ?? []
let attachmentsJSON = reportIssueAttachmentsJSON(attachments)

var error: NSError?
MobileReportIssue(email, issueType, description, device, model, logFilePath, &error)
MobileReportIssue(
email,
issueType,
description,
device,
model,
logFilePath,
attachmentsJSON,
&error
)
if let error {
await self.handleFlutterError(error, result: result, code: "REPORT_ISSUE_ERROR")
return
Expand All @@ -1019,6 +1030,16 @@ class MethodHandler {
}
}

private func reportIssueAttachmentsJSON(_ attachments: [[String: Any]]) -> String {
guard JSONSerialization.isValidJSONObject(attachments),
let data = try? JSONSerialization.data(withJSONObject: attachments),
let json = String(data: data, encoding: .utf8)
else {
return "[]"
}
return json
}

func diagnosticLogFiles(result: @escaping FlutterResult) {
Task {
let logDirectory = FilePath.logsDirectory
Expand Down
Loading
Loading