Censorship circumvention tool available for free download on any operating system
- Flutter (3.32.XX)
- Android Studio (Android Studio Jellyfish | 2023.3.1 Patch 1)
- gomobile
- Xcode
- Git
- Android NDK
- NDK should be version 26.x, for example 26.0.10792818.
make macos
flutter run -d macos
Quick dev loop (run backend in a console)
- Build the Windows service binary
# In an elevated PowerShell
make windows-service-build
- Start the backend
.\bin\windows-amd64\lanternsvc.exe --console
- Build the windows shared library
make windows
- Run the Flutter desktop app
flutter run -d windows
That's it! The Flutter app will talk to the service via the named pipe.
If you prefer running the backend as a real Windows Service during development, use the helper scripts from an elevated PowerShell
- Install Go and gomobile
go install golang.org/x/mobile/cmd/gomobile@latest
gomobile init
- Build and run on an emulator or physical device
make ios
flutter devices
flutter run -d deviceID
- Install Go and gomobile
go install golang.org/x/mobile/cmd/gomobile@latest
gomobile init
- Install Android SDK and NDK
sdkmanager "ndk;23.1.7779620" "cmake;3.18.1" "platform-tools"
- Build the Android app
make android-debug
After running make android-debug, you’ll find the APK here:
build/app/outputs/flutter-apk/app-debug.apk
We use integration_test with headless widget tests and in-memory fakes
flutter test integration_testflutter test integration_test/private_server_flow_test.dart
The app supports automatic updates on macOS and Windows, using the auto_updater package, which is a Flutter-friendly wrapper around the Sparkle update framework.
On startup, the app downloads the appcast.xml feed, hosted in the repo and on S3. This file lists the latest version and the signed .dmg or .zip update files. The updater downloads the update and installs it via Sparkle.
We generate the appcast.xml dynamically using a Python script as part of our release process:
python3 scripts/generate_appcast.py
The script works by fetching releases, the associated .dmg and .exe files, via the GitHub API, signing each asset using the auto_updater:sign_update Dart CLI tool, and emitting an appcast.xml with signature, size, and version metadata.
