# Changelog All notable changes to the ReVoltVPN Flutter app. Versions follow [semver](https://semver.org/): MAJOR.MINOR.PATCH --- ## [3.0.0] — 2026-08 ### 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's `api` freedom 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. - `serverDomain` removed from `AppConfig`. `fetchConfigThroughTunnel()` replaces `fetchConfigWithPolling()`. `connect()` rewritten. ### Protocol — TCP to XHTTP - Transport: TCP → XHTTP (H2 stream-up with Reality). No more XTLS-Vision, no `flow` field. Path-hidden behind `/revolt`. ### Fixed - **RenderFlex overflow** — status bar text wrapped in `Flexible` with `TextOverflow.ellipsis` to prevent overflow on narrow screens (≤360dp). - **Circular import** — removed `import 'package:revoltvpn/main.dart'` from `sidebar_drawer.dart`. `SidebarDrawer` converted to `StatefulWidget`; version footer loaded via `PackageInfo.fromPlatform()`. - Client hot-reload was silently broken — `xray api adi` no-op. Fixed: `adu`/`rmu` commands per Xray HandlerService spec. - Missing XHTTP `path` param in VLESS URL — now reads `xhttp_path` from `/session/status`. - `providerBundleIdentifier` was `com.revoltvpn.app` — must match `com.paladinvpn.app` for VPN service registration. - Reality keypair generated (was placeholder). Throttle `uplinkOnly`/`downlinkOnly` corrected (seconds, not bytes/sec). Fallback rate limits removed (fingerprint). ### 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). ### Server - `api` outbound + 3 routing rules in `xray_config_reality.json` (bootstrap isolation + API routing). Permanent bootstrap client. Hivemind unchanged. - `xhttp_path` in `/session/status` response. - 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** — `_syncInProgress` flag prevents duplicate HTTP requests from overlapping in `_syncWithHivemind()`. - **Debug bypass gate** — `AppConfig.enableAdBypass` replaces `kDebugMode` for fake AdMob callback. Tree-shaken in release builds. ### Changed - **Responsive layout** — main screen uses `LayoutBuilder` with proportional fractions. Scales to any screen size. - **Dynamic version** — sidebar footer reads from `PackageInfo` instead of hardcoded string. - **Swarm/log blocked** — nginx returns 404 for `/api/swarm` and `/api/log`. Monitoring runs locally via `swarm_watch.py`. ### Added - **Update checker** in sidebar — polls GitHub Releases API. - **Website button** in sidebar → opens `https://getrevolt.app`. - **Timer syncing indicator** — spinner during handshake. - Dependency: `package_info_plus`. ### Server - `/session/stop` fetches stats BEFORE popping session (race fix). - `XrayManager._stats_lock` for diagnostic counter thread safety. - `ManagementLoop._start_lock` prevents 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