Files
ReVoltVPN/technical_debt_1_answer.md
T
2026-06-13 13:37:57 +03:00

7.1 KiB

Thoughts and Answers to Technical Audit

Here are my thoughts and proposed actions for every single point raised in the technical audit report. The agent did a fantastic job pointing out native Android issues and server-side edge cases that are crucial for a Google Play launch.


🔴 Critical Blockers

1. Conflicting build.gradle.kts

Thoughts: The agent is 100% correct. Applying com.android.application in the root build.gradle is an anti-pattern in Flutter and will cause massive headaches during the release build. Action: Remove the android {} block and plugin from the root build.gradle.kts.

2. Missing Foreground Service Type Declaration

Thoughts: Android 14+ is incredibly strict about Foreground Services. However, VpnService is a special case in Android that generally provides its own system-level notification. If we are using FOREGROUND_SERVICE_SPECIAL_USE, Google Play will definitely flag us for a manual review. Action: We need to inspect wireguard_flutter and potentially remove our manual FOREGROUND_SERVICE permissions if the AmneziaWG AAR handles it, or correctly classify it to avoid Play Store rejection.

3. AdMob SSV Completely Bypassed

Thoughts: We knowingly bypassed this for your rapid testing phase, so this isn't a surprise. But the agent is right: if we ship this to Google Play, anyone can bypass the ads, and Google might reject it for deceptive ad behavior. Action: When you are ready to enable real ads, we must remove the client-side fake ping in hivemind_service.dart and uncomment the ECDSA signature verification in the Python server.

4. app_config.dart Contains Production Secrets

Thoughts: AdMob App IDs are public anyway (they are embedded in the APK), but tracking IP addresses and configurations in Git is bad practice. Action: We should ensure app_config.dart is untracked (git rm --cached) so future changes don't pollute the repository.

5. /api/session/start Endpoint Does Not Exist

Thoughts: Excellent catch by the agent! Our addBonusTime() method in Flutter posts to a /session/start endpoint that the Python server doesn't even have. Action: We need to refactor addBonusTime(). It shouldn't try to start a session. Instead, watching the ad should trigger the real SSV callback on the server (which already correctly handles bonus_ad to extend time), and the client should simply re-sync the timer.

6. Server Public Key Fallback Is a Hardcoded Invalid String

Thoughts: Passing "server key=" when awg0 fails to read the pubkey will guarantee the Flutter client crashes with an invalid WireGuard config. Action: We should make the server throw a proper HTTP 500 error instead of silently passing garbage to the client.


🟡 Warnings — Architecture & Reliability

7. Optimistic Client State Before Server Confirmation

Thoughts: Showing 01:00:00 before the server confirms the real time causes a glitchy UI jump. Action: We will add a "Calculating..." or "Syncing..." state in the UI until the first _syncWithHivemind succeeds.

8. Race Condition: In-Flight HTTP Callback During Disconnect

Thoughts: If the 3-second sync finishes right after the user hits disconnect, it triggers a double-disconnect. Action: Easy fix. Add a bool _isDisconnecting guard.

9. No Graceful Recovery From Temporary Network Drops

Thoughts: Very important for mobile. If the user drives through a tunnel and loses 4G, the local timer shouldn't blindly tick down to 0 while the server sync fails. Action: Pause the local timer decrement if the HTTP sync throws an error, and resume when it reconnects.

10. Permission Dialog + Immediate Failure = Broken UX

Thoughts: Throwing an exception in Kotlin while the Android permission dialog is still on screen is a bad bug in wireguard_flutter. Action: We need to edit WireguardFlutterPlugin.kt to await the onActivityResult before returning to Flutter.

11. 3-Second Polling Per Client — Server Scalability Issue

Thoughts: Polling every 3 seconds is ~33 req/sec for 100 users. Flask might struggle with this under heavy load. Action: We can increase this to 10 seconds. The local Dart timer is accurate enough to cover the gap.

12. isVpnChecked Flag — Single-Use

Thoughts: We actually solved most of the state restoration in our previous chat, but the native Kotlin plugin state tracking is still a bit messy. Action: Minor cleanup in the Kotlin plugin.

13. Server: management_loop Blocks on Subprocess Calls

Thoughts: subprocess.run("awg show ...") is synchronous and blocks the Python GIL. Action: We can optimize the server to run this in a thread or use a timeout.

14. Server: tc filter Cleanup Is Never Done on Expiry

Thoughts: This is a massive server bug. If a user's session expires naturally, we delete them from memory but leave their bandwidth throttling rules active in the Linux kernel forever. Over time, the server will choke on dead rules. Action: We must call remove_throttle() and remove_wg_peer() in the expiry loop inside server_hivemind_5_0.py.

15. No ProGuard/R8 Rules for AmneziaWG Native Library

Thoughts: Standard Android release builds strip unused code. If it strips AmneziaWG, the release APK will crash on launch. Action: Add ProGuard rules for org.amnezia.awg.**.


🟢 Polish & Best Practices

16-23. The agent's points here are all solid minor improvements. We should host the Privacy Policy on GitHub Pages instead of a raw .md file, make AppConfig private, and untrack server full picture.txt.


👤 User Experience Bugs

The agent highlighted 16 UX bugs. Here are the most impactful ones that we should fix:

  • UX-1 (5-Second Cooldown on Failure): We shouldn't lock the connect button for 5 seconds if the connection fails instantly.
  • UX-3 ("TAP TO CONNECT" Always Visible): We should change the text dynamically (e.g., "NO NETWORK").
  • UX-4 & UX-9 (No Ad Load Feedback): We need to prevent the user from connecting if the ad isn't loaded yet, and show them a "Loading ad..." state.
  • UX-5 (Fake "+30 mins" Snackbar): We must only show this snackbar if the server actually extended the time.
  • UX-6 (2.5s Splash Delay): The artificial Future.delayed in intro.dart should be removed so the app opens instantly.
  • UX-7 (Notification "0.00 KB/s"): We should show "Idle" instead of "0.00 KB/s" to look more professional.
  • UX-10 (Timer clears instantly on Disconnect): We should let the timer stay visible until the disconnection finishes.
  • UX-13 (No Haptic Feedback): Adding HapticFeedback.lightImpact() on the connect button will make the app feel much more premium.

Conclusion

The agent provided an incredibly valuable roadmap. I recommend we tackle these in batches:

  1. Server Fixes: Fix the tc filter memory leak (Critical) and the AdMob SSV / bonus time endpoints.
  2. Android Native Fixes: Fix the build.gradle.kts conflict, ProGuard rules, and the Kotlin permission dialog bug.
  3. Flutter UX Polish: Fix the fake snackbars, loading states, and haptic feedback.