esefxdzandClaude Opus 5 8ba3b6c543 fix(session): alert on every unsolicited native stop, not just the deadline
Second review pass found that VpnStatus.error is unreachable mid-session:
AppConfigs.V2RAY_STATES has no error state and the plugin's stateName when()
ends in else -> "DISCONNECTED", so Dart's unknown -> error mapping is dead
code on Android. Every native stop therefore arrived as a plain disconnect,
and anything other than the expiry deadline - an Xray or TUN setup failure, a
mid-session fail-closed deadline arm - left the user on their real IP with no
notification and no message. That is the exact hole this feature exists to
close.

stopAll() is the single funnel for every native stop, so the alert moves
there: it fires when the stop interrupted a live tunnel and the user did not
ask for it. isRunning is captured before cleanup() clears it, which keeps a
failed connect silent - it never had a tunnel to interrupt. STOP_SERVICE
(the notification's Disconnect action) and onRevoke pass userRequested: in
the revoke case the user switched VPNs or withdrew consent themselves, and
may well be protected by the app that took over.

Also from the pass:
- re-arming now needs the deadline to move by more than 15 s, so round-trip
  jitter cannot cancel and re-post a warning that is already on screen
- a warning delivered with under a minute left is dropped rather than
  announcing "5 minutes"; the disconnected alert follows anyway
- the _doDisconnect comment no longer claims endedMessage posts the alert
- CHANGELOG: the alert does now cover the tunnel stopping unexpectedly

flutter analyze clean; debug APK builds with the Kotlin recompiled.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-10-17 00:44:51 +03:00
2026-09-06 13:07:37 +03:00
2026-07-28 20:56:08 +03:00
2026-07-28 21:37:59 +03:00
2026-10-08 13:20:52 +03:00

ReVoltVPN banner

ReVoltVPN

A free VPN app for Android. Open-source client, transparent infrastructure. Watch an ad, get 2 hours of full-speed traffic — no accounts, no logs, no subscriptions.


How it works

  1. Watch a short rewarded ad
  2. Server creates a temporary VLESS session (2 hours / 10 GB)
  3. Your traffic routes through a single server in Finland at full speed
  4. When time or data runs out, session ends — watch another ad to continue
  5. No throttling, no slow lane, no mid-session punishment

No email. No password. No payment. The ad pays for the server.


Protocol

  • Transport — VLESS over XHTTP (HTTP/2 multiplexed, path-hidden behind /revolt)
  • Obfuscation — Xray Reality spoofs a real website's TLS. To any DPI box, your tunnel looks like a browser visiting that website
  • Encryption — TLS 1.3 with borrowed certificate (Reality). No certbot, no domain ownership required
  • API — Standard HTTPS to a separate domain. Tunnel destination is IP-pinned — domain compromise is DoS only

Stack

Layer Technology
App Flutter (Android)
VPN VLESS + Xray Reality + XHTTP
Backend Python Flask ("Hivemind") — session management, quotas, stats
Ads Google AdMob rewarded, verified server-side
Server Debian, single Hetzner box in Finland

Limitations

  • One server, one location (Finland)
  • 2 vCPU / 4 GB RAM — not built for thousands of concurrent users
  • Android only

Privacy

Your traffic routes through Finland. We don't log it, inspect it, or sell it. Hivemind tracks only session liveness and byte counters for quota enforcement — no packet contents, no destination IPs, no DNS queries.

Full privacy policy: PRIVACY_POLICY.md


ReVoltVPN is not affiliated with any VPN company.

S
Description
A simple vless client built with flutter
Readme GPL-3.0
12 MiB
0 Stars 1 Watchers 0 Forks
3.3.8
Latest
2026-10-17 18:55:59 +03:00
Languages
Dart 59.5%
Kotlin 38.2%
Shell 2.3%