Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
aca4163
migrate to new ipc.Client api, first-pass
garmr-ulfr Mar 24, 2026
828bd23
pullin a couple fixes, update linux vpn status poller
garmr-ulfr Mar 25, 2026
b978153
start ipc server ios/macos
garmr-ulfr Mar 25, 2026
f019c69
update radiance, fix linux daemon build
garmr-ulfr Mar 25, 2026
7a0cce8
start ipc server windows service
garmr-ulfr Mar 25, 2026
eb24410
fix datacap stream
garmr-ulfr Mar 25, 2026
489941d
decode user response data to json
garmr-ulfr Mar 26, 2026
37f7c17
Merge branch 'main' into garmr/radiance-daemon-refactor
garmr-ulfr Mar 26, 2026
745cb4c
gofmt
garmr-ulfr Mar 26, 2026
301fdfd
update ipc request path check for linux smoke test
garmr-ulfr Mar 26, 2026
9bcb13e
Fixed issue with user apis
jigar-f Apr 2, 2026
73d3f6e
Merge branch 'main' into garmr/radiance-daemon-refactor
garmr-ulfr Apr 3, 2026
2f6c135
redo linux packaging changes undone by merge
garmr-ulfr Apr 3, 2026
17c8984
move RunOffCgoStack from radiance to here, small cleanup
garmr-ulfr Apr 3, 2026
a0e73de
fetch radiance-owned settings on demand instead of caching locally
garmr-ulfr Apr 4, 2026
8c50596
add missing smart-routing, ad-block, oauth calls
garmr-ulfr Apr 4, 2026
b957460
Merge remote-tracking branch 'origin/main' into garmr/radiance-daemon…
garmr-ulfr Apr 6, 2026
5068d41
clean up
garmr-ulfr Apr 6, 2026
dcb9c7a
fix ref async issue for IPC calls
garmr-ulfr Apr 6, 2026
d3646b0
gofmt
garmr-ulfr Apr 6, 2026
2a0be81
fix test, linux package verification
garmr-ulfr Apr 7, 2026
8a9ef3e
update radiance, remove server groups
garmr-ulfr Apr 7, 2026
03296f9
fix: return added server tags from AddServersByURL
garmr-ulfr Apr 7, 2026
bd89bea
wrap ffi calls in runOnGoStack, update win service
garmr-ulfr Apr 8, 2026
61cebb1
add explicit not linux build tag
garmr-ulfr Apr 8, 2026
4e69a93
update radiance
garmr-ulfr Apr 8, 2026
76a66de
use RADIANCE_REPO in lanternd src
garmr-ulfr Apr 8, 2026
062feb4
flatten server model to match radiance, fix tests
garmr-ulfr Apr 8, 2026
6d238fe
use loopback ipc client for mobile
garmr-ulfr Apr 8, 2026
823c297
update radiance, log service install error in smoke test
garmr-ulfr Apr 8, 2026
1459e9d
retrieve selected server from radiance instead of cacheing
garmr-ulfr Apr 9, 2026
e0592a9
stop lantern before unintall, revert accidental service name change
garmr-ulfr Apr 9, 2026
c0f2460
remove allow override
garmr-ulfr Apr 9, 2026
789cf32
fix name reference and misplaced stop call
garmr-ulfr Apr 9, 2026
71b1c47
Merge branch 'main' into garmr/radiance-daemon-refactor
garmr-ulfr Apr 10, 2026
e80ec8c
fix several issues
garmr-ulfr Apr 10, 2026
07a1242
code review
garmr-ulfr Apr 10, 2026
0e81345
fix toggles not registering and fetching plans
garmr-ulfr Apr 10, 2026
1822f34
always refetch server list when view opens
garmr-ulfr Apr 11, 2026
d19ce35
fix crash in server select screen
garmr-ulfr Apr 13, 2026
7a84586
fix split tunnel website view not loading websites
garmr-ulfr Apr 13, 2026
78baaab
sync vpn status from system on launch
garmr-ulfr Apr 13, 2026
a21a218
fix stale onboarding marker persisting reinstall
garmr-ulfr Apr 13, 2026
7ff1edd
Revert "fix stale onboarding marker persisting reinstall"
garmr-ulfr Apr 14, 2026
0ccd45b
fix vpn prompt displaying when quiting
garmr-ulfr Apr 14, 2026
c5d9c12
Macos system extension updates #2 (#8637)
jigar-f Apr 10, 2026
07518cd
Filter system apps from Windows split tunneling (#8641)
atavism Apr 10, 2026
cc2f744
fix: upload and notify for nightlies even when some platforms fail (#…
myleshorton Apr 13, 2026
c9afeff
feat: add arch to releases (#8652)
reflog Apr 13, 2026
3363105
fix issues from 3173
garmr-ulfr Apr 14, 2026
3d44f7a
Refactor and fixed multiple bugs
jigar-f Apr 15, 2026
eba085b
cache selected server location locally to avoid UI flash
garmr-ulfr Apr 15, 2026
bc291d7
Fix tunnel issue in android
jigar-f Apr 16, 2026
8d16578
App event issue and auto server location fixes
jigar-f Apr 16, 2026
2350ea1
added logs
jigar-f Apr 16, 2026
19f2fa8
mobile: return string instead of []byte + update Swift callers (#8663)
myleshorton Apr 16, 2026
4d4e06d
encapsulate ipc.Client behind LanternCore interface
garmr-ulfr Apr 16, 2026
a4f7e0a
ios/macos: drop invalid optional-chaining on non-optional String (#8671)
myleshorton Apr 16, 2026
8bfecc3
add android-test + android-reproduce for emulator testing and ticket …
myleshorton Apr 17, 2026
fb920ea
Fix private server navigation issue
jigar-f Apr 17, 2026
8d04c0f
deps: bump sing-box-minimal to v1.12.21-lantern on refactor (#8679)
myleshorton Apr 17, 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
14 changes: 8 additions & 6 deletions .github/scripts/linux_config_url_smoke.sh
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,25 @@
set -euo pipefail

if [[ -z "${JOIN_SERVER_CONFIG_URLS:-}" ]]; then
echo "Skipping Linux config URL smoke test (JOIN_SERVER_CONFIG_URLS is not set)."
exit 0
echo "Skipping Linux config URL smoke test (JOIN_SERVER_CONFIG_URLS is not set)."
exit 0
fi

config_urls_file="$(mktemp)"
cleanup() {
rm -f "$config_urls_file"
rm -f "$config_urls_file"
}
trap cleanup EXIT

set +x
printf '%s' "$JOIN_SERVER_CONFIG_URLS" > "$config_urls_file"
printf '%s' "$JOIN_SERVER_CONFIG_URLS" >"$config_urls_file"
chmod 600 "$config_urls_file"
set -x

config_server_base="${JOIN_SERVER_CONFIG_SERVER_NAME:-ci-config-url-smoke-${GITHUB_RUN_ID:-local}-${GITHUB_RUN_ATTEMPT:-1}}"
config_skip_cert="${JOIN_SERVER_CONFIG_SKIP_CERT_VERIFICATION:-true}"

sg lantern -c "env PATH=$PATH HOME=$HOME JOIN_SERVER_CONFIG_URLS_FILE=\"$config_urls_file\" JOIN_SERVER_CONFIG_SERVER_NAME=\"${config_server_base}-api\" JOIN_SERVER_CONFIG_SKIP_CERT_VERIFICATION=\"$config_skip_cert\" xvfb-run -a flutter test integration_test/vpn/linux_config_url_api_smoke_test.dart -d linux --dart-define=DISABLE_SYSTEM_TRAY=true"
sg lantern -c "env PATH=$PATH HOME=$HOME JOIN_SERVER_CONFIG_URLS_FILE=\"$config_urls_file\" JOIN_SERVER_CONFIG_SERVER_NAME=\"${config_server_base}-ui\" JOIN_SERVER_CONFIG_SKIP_CERT_VERIFICATION=\"$config_skip_cert\" xvfb-run -a flutter test integration_test/vpn/linux_config_url_smoke_test.dart -d linux --dart-define=DISABLE_SYSTEM_TRAY=true"
JOIN_SERVER_CONFIG_URLS_FILE="$config_urls_file" JOIN_SERVER_CONFIG_SERVER_NAME="${config_server_base}-api" JOIN_SERVER_CONFIG_SKIP_CERT_VERIFICATION="$config_skip_cert" \
xvfb-run -a flutter test integration_test/vpn/linux_config_url_api_smoke_test.dart -d linux --dart-define=DISABLE_SYSTEM_TRAY=true
JOIN_SERVER_CONFIG_URLS_FILE="$config_urls_file" JOIN_SERVER_CONFIG_SERVER_NAME="${config_server_base}-ui" JOIN_SERVER_CONFIG_SKIP_CERT_VERIFICATION="$config_skip_cert" \
xvfb-run -a flutter test integration_test/vpn/linux_config_url_smoke_test.dart -d linux --dart-define=DISABLE_SYSTEM_TRAY=true
78 changes: 33 additions & 45 deletions .github/scripts/windows_connect_smoke.ps1
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
param(
[string]$ServiceName = "LanternSvc",
[string]$ServiceExe = "build/windows/x64/runner/Release/lanternsvc.exe",
[string]$ServiceExe = "build/windows/x64/runner/Release/lanternd.exe",
[string]$InstallerPath = "",
[string]$TokenPath = "C:\ProgramData\Lantern\ipc-token",
[string]$TestPath = "integration_test/vpn/windows_connect_smoke_test.dart",
[string]$ConfigUrlApiTestPath = "integration_test/vpn/windows_config_url_api_smoke_test.dart",
[string]$ConfigUrlUiTestPath = "integration_test/vpn/windows_config_url_smoke_test.dart",
Expand Down Expand Up @@ -152,33 +151,20 @@ function Wait-ServiceRunning {
}

sc.exe query $Name
throw "Windows service did not reach Running state"
}

function Wait-TokenFile {
param(
[string]$Path,
[int]$TimeoutSeconds
)

for ($i = 0; $i -lt $TimeoutSeconds; $i++) {
if (Test-Path $Path) {
try {
$token = (Get-Content -Path $Path -Raw -ErrorAction Stop).Trim()
} catch {
$token = ""
}
if (-not [string]::IsNullOrWhiteSpace($token)) {
Write-Step "IPC token detected at $Path with content"
return
}
}
if ($i -gt 0 -and ($i % 5) -eq 0) {
Write-Step "Waiting for non-empty IPC token at $Path ($i/$TimeoutSeconds s)"
}
Start-Sleep -Seconds 1
# Dump diagnostics so we can tell whether the daemon binary was installed and why the service wasn't created.
$lanterndPath = "C:\Program Files\Lantern\lanternd.exe"
if (Test-Path $lanterndPath) {
Write-Step "lanternd.exe exists at $lanterndPath"
& $lanterndPath version 2>&1 | ForEach-Object { Write-Step " version: $_" }
} else {
Write-Step "lanternd.exe NOT found at $lanterndPath"
Write-Step "Contents of C:\Program Files\Lantern\:"
Get-ChildItem "C:\Program Files\Lantern\" -ErrorAction SilentlyContinue |
ForEach-Object { Write-Step " $($_.Name)" }
}
throw "IPC token file missing or empty at $Path"

throw "Windows service did not reach Running state"
}

function Install-FromInstaller {
Expand All @@ -199,6 +185,16 @@ function Install-FromInstaller {
-PulseSeconds $HeartbeatSeconds `
-Description "Running installer"

# After the installer runs, try running 'lanternd install' manually if the service
# wasn't created. This helps diagnose whether the issue is in the installer or the
# daemon itself.
$lanterndPath = "C:\Program Files\Lantern\lanternd.exe"
$svc = Get-Service -Name $Name -ErrorAction SilentlyContinue
if (-not $svc -and (Test-Path $lanterndPath)) {
Write-Step "Service not found after installer; running lanternd install manually for diagnostics"
& $lanterndPath install 2>&1 | ForEach-Object { Write-Step " $_" }
}

Write-Step "Waiting for Windows service after installer"
Wait-ServiceRunning -Name $Name -TimeoutSeconds $TimeoutSeconds
}
Expand Down Expand Up @@ -243,24 +239,11 @@ try {
Write-Step "Smoke setup mode: direct service binary"
$resolvedServiceExe = (Resolve-Path $ServiceExe).Path
Remove-ServiceIfPresent -Name $ServiceName
Invoke-ScCommand `
-ArgumentList @(
"create",
$ServiceName,
"binPath= `"$resolvedServiceExe`"",
"start= demand",
"DisplayName= Lantern Service (CI)"
) `
-Description "Creating Windows service from $resolvedServiceExe"
Invoke-ScCommand `
-ArgumentList @("start", $ServiceName) `
-AllowedExitCodes @(0, 1056) `
-Description "Starting Windows service $ServiceName"
Write-Step "Installing lanternd service from $resolvedServiceExe"
& $resolvedServiceExe install
Wait-ServiceRunning -Name $ServiceName -TimeoutSeconds $WaitSeconds
}

Wait-TokenFile -Path $TokenPath -TimeoutSeconds $WaitSeconds

$flutterArgs = @(
"test",
$TestPath,
Expand Down Expand Up @@ -296,8 +279,7 @@ try {
$env:JOIN_SERVER_CONFIG_SKIP_CERT_VERIFICATION = "true"
}

# Rollout phase: run API smoke and UI smoke with unique names to avoid collisions.
$env:JOIN_SERVER_CONFIG_SERVER_NAME = "$configServerBaseName-api"
# API smoke: server tag comes from the URL, no server name needed.
$configApiArgs = @(
"test",
$ConfigUrlApiTestPath,
Expand All @@ -312,6 +294,7 @@ try {
throw "Windows config URL API smoke test failed with exit code $LASTEXITCODE"
}

# UI smoke: server name is typed into the join form.
$env:JOIN_SERVER_CONFIG_SERVER_NAME = "$configServerBaseName-ui"
$configUiArgs = @(
"test",
Expand All @@ -334,7 +317,12 @@ finally {
if ($UseInstaller) {
Uninstall-FromInstalledService -Name $ServiceName
} else {
Remove-ServiceIfPresent -Name $ServiceName
$resolvedServiceExe = (Resolve-Path $ServiceExe -ErrorAction SilentlyContinue).Path
if ($resolvedServiceExe) {
& $resolvedServiceExe uninstall
} else {
Remove-ServiceIfPresent -Name $ServiceName
}
}
Write-Step "Cleanup finished"
} catch {
Expand Down
2 changes: 0 additions & 2 deletions .github/workflows/build-android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ jobs:
with:
path: |
~/.pub-cache
.dart_tool
key: ${{ runner.os }}-flutter-${{ hashFiles('**/pubspec.lock') }}
restore-keys: |
${{ runner.os }}-flutter-
Expand Down Expand Up @@ -101,7 +100,6 @@ jobs:
with:
path: |
~/.pub-cache
.dart_tool
key: ${{ runner.os }}-dart-${{ hashFiles('**/pubspec.lock') }}
restore-keys: |
${{ runner.os }}-dart-
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build-ios.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ jobs:
continue-on-error: true
with:
path: |
.dart_tool
~/.pub-cache
key: ${{ runner.os }}-flutter-${{ hashFiles('**/pubspec.lock') }}
restore-keys: |
${{ runner.os }}-flutter-
Expand Down
22 changes: 13 additions & 9 deletions .github/workflows/build-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ jobs:
with:
path: |
~/.pub-cache
.dart_tool
key: ${{ runner.os }}-flutter-${{ hashFiles('**/pubspec.lock') }}
restore-keys: |
${{ runner.os }}-flutter-
Expand Down Expand Up @@ -192,8 +191,6 @@ jobs:
exit 1
fi

sudo usermod -aG lantern "$USER" || true

systemctl is-active --quiet lanternd.service
test -S /run/lantern/lanternd.sock
sudo stat -c "%a %U %G %n" /run/lantern/lanternd.sock
Expand All @@ -203,7 +200,7 @@ jobs:
run: |
set -euxo pipefail
code=0
sg lantern -c "env HOME=$HOME PATH=$PATH xvfb-run -a timeout 15s /usr/bin/lantern >/tmp/lantern-installed-smoke.log 2>&1" || code=$?
xvfb-run -a timeout 15s /usr/bin/lantern >/tmp/lantern-installed-smoke.log 2>&1 || code=$?
if [[ "$code" -ne 124 ]]; then
cat /tmp/lantern-installed-smoke.log || true
echo "Installed /usr/bin/lantern did not stay up under xvfb"
Expand All @@ -226,7 +223,7 @@ jobs:
ENABLE_IP_CHECK=true
fi
set +e
sg lantern -c "env PATH=$PATH HOME=$HOME timeout --signal=TERM --kill-after=30s 8m xvfb-run -a flutter test integration_test/vpn/linux_connect_smoke_test.dart -d linux --reporter=expanded --dart-define=DISABLE_SYSTEM_TRAY=true --dart-define=ENABLE_IP_CHECK=${ENABLE_IP_CHECK}"
timeout --signal=TERM --kill-after=30s 8m xvfb-run -a flutter test integration_test/vpn/linux_connect_smoke_test.dart -d linux --reporter=expanded --dart-define=DISABLE_SYSTEM_TRAY=true --dart-define=ENABLE_IP_CHECK=${ENABLE_IP_CHECK}
SMOKE_EXIT=$?
set -e

Expand All @@ -241,14 +238,14 @@ jobs:
exit "$SMOKE_EXIT"
fi

if ! grep -Eq 'IPC request.*path=/service/start' /tmp/lanternd-journal-ui-smoke.log; then
echo "Missing /service/start IPC request in lanternd journal"
if ! grep -Eq 'IPC request.*path=/vpn/connect' /tmp/lanternd-journal-ui-smoke.log; then
echo "Missing /vpn/connect IPC request in lanternd journal"
tail -n 200 /tmp/lanternd-journal-ui-smoke.log || true
exit 1
fi

if ! grep -Eq 'IPC request.*path=/service/stop' /tmp/lanternd-journal-ui-smoke.log; then
echo "Missing /service/stop IPC request in lanternd journal"
if ! grep -Eq 'IPC request.*path=/vpn/disconnect' /tmp/lanternd-journal-ui-smoke.log; then
echo "Missing /vpn/disconnect IPC request in lanternd journal"
tail -n 200 /tmp/lanternd-journal-ui-smoke.log || true
exit 1
fi
Expand All @@ -268,3 +265,10 @@ jobs:
name: lantern-installer-deb-${{ matrix.arch }}
path: ${{ env.FULL_INSTALLER_NAME }}.deb
retention-days: 2

- name: Upload Linux build (Arch)
uses: actions/upload-artifact@v4
with:
name: lantern-installer-pkg-${{ matrix.arch }}
path: ${{ env.FULL_INSTALLER_NAME }}.pkg.tar.zst
retention-days: 2
3 changes: 1 addition & 2 deletions .github/workflows/build-macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,9 @@ jobs:
with:
path: |
~/.pub-cache
.dart_tool
key: ${{ runner.os }}-flutter-${{ hashFiles('**/pubspec.lock') }}
restore-keys: |
${{ runner.os }}-flutter-
${{ runner.os }}-flutter-
- name: Cache macOS CocoaPods
uses: actions/cache@v4
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/build-windows-service.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@ jobs:
- name: Build Windows service
shell: pwsh
run: |
make windows-service-build
Move-Item "bin\windows-amd64\lanternsvc.exe" "lanternsvc.exe"
make lanternd-windows-amd64
Move-Item "bin\windows-amd64\lanternd.exe" "lanternd.exe"

- name: Upload Windows service executable
uses: actions/upload-artifact@v4
with:
name: lantern-service-exe
path: "lanternsvc.exe"
path: "lanternd.exe"
retention-days: 2
2 changes: 0 additions & 2 deletions .github/workflows/build-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ jobs:
with:
path: |
~/.pub-cache
.dart_tool
key: ${{ runner.os }}-flutter-${{ hashFiles('**/pubspec.lock') }}
restore-keys: |
${{ runner.os }}-flutter-
Expand Down Expand Up @@ -135,7 +134,6 @@ jobs:

# Third-party binaries that are already signed by their vendors
$thirdParty = @(
'wintun.dll', # WinTun
'flutter_windows.dll', # Google/Flutter
'WebView2Loader.dll', # Microsoft
'WinSparkle.dll' # WinSparkle
Expand Down
16 changes: 6 additions & 10 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -388,13 +388,10 @@ jobs:
build-android,
build-ios,
]
# Run if at least one platform build succeeded. Individual platform failures
# (e.g., Linux arm64) should not block uploading successful builds.
if: |
!cancelled() &&
(needs.build-macos.result == 'success' || needs.build-macos.result == 'skipped') &&
(needs.build-windows.result == 'success' || needs.build-windows.result == 'skipped') &&
(needs.build-linux.result == 'success' || needs.build-linux.result == 'skipped') &&
(needs.build-android.result == 'success' || needs.build-android.result == 'skipped') &&
(needs.build-ios.result == 'success' || needs.build-ios.result == 'skipped') &&
(needs.build-macos.result == 'success' || needs.build-windows.result == 'success' ||
needs.build-linux.result == 'success' || needs.build-android.result == 'success' ||
needs.build-ios.result == 'success')
Expand Down Expand Up @@ -470,14 +467,10 @@ jobs:
build-android,
build-ios,
]
# Run if at least one platform build succeeded.
if: |
!cancelled() &&
needs.release-create.result == 'success' &&
(needs.build-macos.result == 'success' || needs.build-macos.result == 'skipped') &&
(needs.build-windows.result == 'success' || needs.build-windows.result == 'skipped') &&
(needs.build-linux.result == 'success' || needs.build-linux.result == 'skipped') &&
(needs.build-android.result == 'success' || needs.build-android.result == 'skipped') &&
(needs.build-ios.result == 'success' || needs.build-ios.result == 'skipped') &&
(needs.build-macos.result == 'success' || needs.build-windows.result == 'success' ||
needs.build-linux.result == 'success' || needs.build-android.result == 'success' ||
needs.build-ios.result == 'success')
Expand Down Expand Up @@ -565,6 +558,9 @@ jobs:
upload_if_exists "lantern-installer-rpm-arm64/${FULL_NAME}-arm64.rpm"
upload_if_exists "lantern-installer-deb/${FULL_NAME}.deb"
upload_if_exists "lantern-installer-rpm/${FULL_NAME}.rpm"
upload_if_exists "lantern-installer-pkg-amd64/${FULL_NAME}.pkg.tar.zst"
upload_if_exists "lantern-installer-pkg-arm64/${FULL_NAME}-arm64.pkg.tar.zst"
upload_if_exists "lantern-installer-pkg/${FULL_NAME}.pkg.tar.zst"
upload_if_exists "lantern-installer-ipa/${FULL_NAME}.ipa"

# Post-publish steps (only for non-nightly production/beta builds)
Expand Down
Loading
Loading