The only way to deal with an unfree world is to become so absolutely free that your very existence is an act of rebellion.
— Albert Camus
Detect captive portals and automatically get liberated on Android and Linux.
Features:
- A background service waits for networks with portals and tries to solve them automatically
- Record and submit new portals
Required Permissions:
Notificationsfor running in the backgroundLocationfor obtaining names (SSIDs) of the Wi-Fi networks
- Download the APK from GitHub Releases
arm64should work on almost all phones, use this if unsurearmis mainly useful for old phonesuniversalworks everywhere
- Install the APK on your Android device
- Follow the instructions to set up the app
- Open the app
- A persistent notification will show up indicating the service is running
- The service will automatically detect and liberate captive portals when you connect to Wi-Fi networks
You can have your device automatically connect to supported networks.
- Open the app
- Enable "Network Suggestions"
- Click allow on androids network suggestions popup
The app only sends a list of supported networks to Android, we have no control over when and if Android actually decides to connect to them.
You can manually trigger a liberation attempt:
- Open the app's advanced settings or view the notification
- Tap "Liberate me now" to attempt liberation on the current network
- The notification will show whether the attempt was successful
To help add support for new portals:
- Connect to a captive portal network
- Open the app and tap "Capture Captive Portal Login" or click on Android's "Sign in to network" and select "CaptivePortalAutoLogin"
- Liberate the portal manually
- Confirm the popup to upload the captured data
In order to run in the background, Android requires us to show a persistent notification. On modern Android versions this notification can be swiped away, but it will re-appear with the next service start. Many Android variants allow the user to only disable the notification category "Persistent Notification", but don't disable the notifications of the entire app, because that would make the app dysfunctional.
The Linux module is a JVM CLI that listens to NetworkManager via nmcli and runs the liberator when connectivity
changes to portal.
Build a fat jar:
./gradlew :linux:shadowJar- Artifact:
linux/build/libs/linux-shadow.jar
Run:
- One‑shot check:
java -jar linux/build/libs/linux-shadow.jar --oneshot - As a service (keeps monitoring):
java -jar linux/build/libs/linux-shadow.jar --service - Options:
--force: run without checking connectivity first (implies one‑shot)--experimental: enable experimental/incomplete portal handlers--restartNetworking: toggle NetworkManager off/on at start;- at runtime: press
rto restart networking,qto quit
Portal support lives under liberator/src/main/kotlin/de/binarynoise/liberator/portals.
To add a portal:
- Copy the
_Templateclass and rename it. - Implement
PortalLiberatorwithcanSolve(...)andsolve(...)methods. - Optionally annotate with
@SSID("ssid1", "ssid2", ...). - Test your implementation in the wild.
- Submit a Pull Request.