esefxdzandClaude Opus 5 dd1082c8de fix(session): repair the expiry warning and the gaps the review found
Review of 742f376 (Fable). Three defects made the feature not work for the
case it exists for:

- armExpiryWarning() cancelled the alarm before its own early return. Dart
  re-pushes the deadline every 60 s with no dedupe (rule 93's ">5 s" dedupe
  does not exist), so the first sync after the warning came due deleted the
  armed alarm and never re-armed it. Cancel now happens only on the branch
  that re-arms.
- cancelSessionWarningAlarm() built its PendingIntent with
  FLAG_UPDATE_CURRENT, rewriting the live alarm's RUNTIME_TOKEN to "" so a
  delivery in flight was dropped as a stale generation. It now looks the
  existing PendingIntent up with FLAG_NO_CREATE.
- SOCKS5 mode never requested POST_NOTIFICATIONS (requestPermission() is
  TUN-only because it also raises the VPN consent dialog), so on Android 13+
  both alerts were dropped. New plugin method requests it on its own.

Also:
- the native deadline wins the expiry race against the 1 s Dart tick, so the
  commonest session end reached _onVpnConnectionChanged as a bare tunnel
  drop with no message. It now reconciles and sets the expiry text, with
  postAlert false since the native side already posted.
- a resume reconnect no longer resets the support-ad claim: it re-attaches
  to the same server session, where the top-up has already been spent.
- RevoltAlerts sets setOnlyAlertOnce so a replacing post does not re-sound.
- AGENTS.md rule 93 described a setSessionExpiry/SESSION_EXPIRES_AT_MS path
  that no longer exists, dedupe included. Corrected; that stale text is what
  the warning bug was written against.
- CHANGELOG no longer claims the alert covers the tunnel stopping on its own.

flutter analyze clean; debug APK builds.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-10-17 00:22:26 +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%