User-Agent spoofed to Chrome on Android (was Dart/3.x). Domain renamed to userevolt.app. Branding to Revolt VPN. Removed duplicate notification, patched flutter_vless for custom icon + dark background. Merged 5 disconnect paths into single idempotent gate, fixed stopVless timeout silently lying about state. Removed kDebugMode guard from AdMob bypass.
6.0 KiB
6.0 KiB
Changelog
All notable changes to the ReVoltVPN Flutter app. Versions follow semver: MAJOR.MINOR.PATCH
[3.2.0] — 2026-08-08
DPI hardening
- Spoof Chrome-on-Android User-Agent on all API calls instead of
Dart/3.x. - Renamed domain from
getrevolt.apptouserevolt.app.
Branding
- App name changed from "REVOLT VPN" to "Revolt VPN" across manifest, splash, notification, and VLESS URL remark.
Notification
- Removed duplicate
flutter_local_notificationsnotification. Only the Android VPN foreground-service notification remains — non-swipeable. - Patched
flutter_vlessnative code to use custom notification icon (@drawable/notification_icon) with dark background (#0D1117).
Connection reliability
- Merged five separate disconnect paths into a single idempotent
_doDisconnect()gate. Eliminated race between timer ticks and VPN teardown where the countdown could briefly show -1. stopVless()timeout (5 s) now correctly shows an error instead of silently pretending the VPN disconnected while the tunnel was still alive.
AdMob bypass
kDebugModeguard removed — the debug AdMob callback now fires in release builds so release APKs can create sessions without real ads during testing. The real gate isADMOB_BYPASSon the server.
Fixed
- Notification icon: Replaced five density-specific
ic_launcher.pngfiles withnotification_icon.png, then reverted to avoid changing the home-screen icon. The custom icon is now injected through flutter_vless'sinitializeVless()parameters.
[3.1.0] — 2026-08-06
Architecture — domain-free client
- Zero domain strings in APK. RKN has nothing to DNS-block. API calls go
through the Reality tunnel to
10.254.254.1:5000, redirected to Flask by Xray'sapifreedom outbound (redirect: 127.0.0.1:5000). - Bootstrap tunnel. Bundled Reality config in APK → connect → fetch real
per-session VLESS URL from inside the tunnel → reconnect. Bootstrap client
permanently in
xray_config_reality.json, restricted by Xray routing to internal API only. serverDomainremoved fromAppConfig.fetchConfigThroughTunnel()replacesfetchConfigWithPolling().connect()rewritten.
Protocol — TCP to XHTTP
- Transport: TCP → XHTTP (H2 stream-up with Reality). No more XTLS-Vision,
no
flowfield. Path-hidden behind/revolt.
Fixed
- RenderFlex overflow — status bar text wrapped in
FlexiblewithTextOverflow.ellipsisto prevent overflow on narrow screens (≤360dp). - Circular import — removed
import 'package:revoltvpn/main.dart'fromsidebar_drawer.dart.SidebarDrawerconverted toStatefulWidget; version footer loaded viaPackageInfo.fromPlatform(). - Client hot-reload was silently broken —
xray api adino-op. Fixed:adu/rmucommands per Xray HandlerService spec. - Missing XHTTP
pathparam in VLESS URL — now readsxhttp_pathfrom/session/status. providerBundleIdentifierwascom.revoltvpn.app— must matchcom.paladinvpn.appfor VPN service registration.- Reality keypair generated (was placeholder). Throttle
uplinkOnly/downlinkOnlycorrected (seconds, not bytes/sec). Fallback rate limits removed (fingerprint).
Added
- Settings screen — reached from a new sidebar row (between Website and
Check for updates). Slide-from-right navigation via
PageRouteBuilder. Folder:lib/screens/settings/with one file per feature inin_settings/. - Haptic feedback toggle — on/off switch in Settings for
lightImpact()vibration on successful connect/disconnect. Default: off. Uses sync-bool pattern (no await on tap, no SharedPreferences in connect button). - Rain/Lightning effect toggles — two switches in Settings to control the animated background effects. Default: on. Effects detect the toggle within one frame (no Provider/notifier needed).
Changed
- Timer box spinner removed — the "Connecting…"/"Syncing…" spinner under the countdown was redundant with the connect button's spinner. Timer card is now a clean countdown only (gray '00:00:00' when idle).
- Sidebar now has 7 rows (added Settings).
FRONTEND_POLISH_REVIEW.mdfully triaged: 4 items fixed, 11 skipped.
Server
apioutbound + 3 routing rules inxray_config_reality.json(bootstrap isolation + API routing). Permanent bootstrap client. Hivemind unchanged.xhttp_pathin/session/statusresponse.- Full deployment guide:
SERVER_DEPLOYMENT.md.
[2.0.7] — 2026-07-31
Fixed
- Notification bug —
SessionTimer.stop()now cancels the persistent Android notification on user-initiated disconnect. - Concurrent sync guard —
_syncInProgressflag prevents duplicate HTTP requests from overlapping in_syncWithHivemind(). - Debug bypass gate —
AppConfig.enableAdBypassreplaceskDebugModefor fake AdMob callback. Tree-shaken in release builds.
Changed
- Responsive layout — main screen uses
LayoutBuilderwith proportional fractions. Scales to any screen size. - Dynamic version — sidebar footer reads from
PackageInfoinstead of hardcoded string. - Swarm/log blocked — nginx returns 404 for
/api/swarmand/api/log. Monitoring runs locally viaswarm_watch.py.
Added
- Update checker in sidebar — polls GitHub Releases API.
- Website button in sidebar → opens
https://userevolt.app. - Timer syncing indicator — spinner during handshake.
- Dependency:
package_info_plus.
Server
/session/stopfetches stats BEFORE popping session (race fix).XrayManager._stats_lockfor diagnostic counter thread safety.ManagementLoop._start_lockprevents TOCTOU on daemon startup.
[1.0.6] — 2026-06
- Initial VLESS + Xray Reality tunnel
- 60 min session, 4 GB throttle, support top-up
- Server health dot, speed display, countdown timer
- Persistent Android notification
- Glass-morphism dark UI with yellow accent
- Right-edge sidebar with Ad Consent, Privacy, About, Discord