Skip to content

NetValve v1.0.0 - Initial Release

Latest

Choose a tag to compare

@IEAmir IEAmir released this 24 Jul 14:54
· 7 commits to main since this release

NetValve v1.0.0 — Release Notes

Release date: July 24, 2026
Tag: v1.0.0
APK size: ~60 MB (loopback) / ~67 MB (netstack)


🎉 NetValve v1.0.0 — First Public Release

NetValve is a root-free, local-VPN per-app traffic controller for Android. This is the first public release — a complete, working application with all core features functional.


✨ Features

Traffic Shaping

  • Per-app bandwidth limits — set download/upload caps per app (KB/s, MB/s, kbps, Mbps)
  • Token-bucket pacing — smooth, accurate rate limiting with burst tolerance
  • Suspend-to-pace, not drop — TCP backpressure + bounded UDP queue; protects VoIP, gaming, streaming
  • DNS exemption — name resolution never throttled (latency protection)
  • Live, no-busy-wait — efficient coroutine-based design

App Control

  • App blocking — cut all network access per app
  • Time-based schedules — e.g., block after midnight
  • Day-of-week schedules — different rules for weekdays vs weekends
  • Foreground/Background rules — different caps based on app state
  • Condition-based policies — Wi-Fi/mobile/roaming/charging/battery/screen/foreground

Monitoring

  • Live throughput — current, average, peak (per app)
  • Connection counts — active, throttled, blocked
  • DNS stats — query counts and cache state
  • Connect latency — measured per protected socket
  • Per-app totals — persistent across restarts
  • Leveled logging — DEBUG/INFO/WARNING/ERROR with filtering and export

Platform

  • Root-free — works on stock Android, no Magisk/KernelSU
  • Local-only — no remote server, no telemetry, no trackers
  • Material 3 UI — Jetpack Compose, dark/light themes
  • Battery-aware — Doze exemption guidance, OEM-specific deep links
  • Boot persistence — re-arm tunnel after reboot (opt-in)
  • VPN coexistence — graceful onRevoke handling

Architecture

  • Generic policy engine — conditions × actions DSL, extensible
  • Plugin pipelineTrafficModule API for custom features
  • gVisor netstack — production-grade TCP/IP (in netstack engine)
  • Pure-Kotlin loopback — no native toolchain required to build/test

📦 Installation

Quick Start (Loopback APK)

  1. Download app-debug.apk from the assets below
  2. On your Android 10+ device, enable "Install from unknown sources" for your browser
  3. Install the APK
  4. Launch NetValve
  5. Grant VPN consent when prompted
  6. Go to Apps → select apps to control
  7. Tap an app → set caps/rules
  8. Flip the switch on Dashboard to start the tunnel

Production Build (Netstack APK)

The prebuilt app-netstack-arm64-debug.apk may not match your device. To build your own:

git clone https://github.com/IEAmir/NetValve.git
cd NetValve

# Build the netstack AAR (needs Go 1.22+ and Android NDK)
cd netstack && ./build-aar.sh && cd ..

# Build the APK with netstack engine
./gradlew :app:assembleDebug -Pnetvalve.netstack=true

See docs/BUILD_VERIFICATION.md for details.


⚠️ Known Issues & Limitations

These are documented honestly. None are blockers for a v1.0.0 release, but you should know them.

Platform Constraints

  • One VPN at a time — Android platform rule. Starting another VPN app revokes NetValve. NetValve handles onRevoke gracefully.
  • Controlled-app set needs tunnel rebuild — Adding/removing apps from the selection triggers a seamless ACTION_RESTART. Editing rule caps does NOT need a rebuild.
  • Per-app attribution uses getConnectionOwnerUid (API 29+). On some OEM ROMs, a fraction of flows may land in an "Unknown" bucket (shaped by global default).
  • IPv6 is always routed into the tunnel (so it cannot bypass shaping). Two modes: RELAY (default) or FAST_REJECT (immediate RST/ICMPv6).

Build/Distribution

  • Loopback engine does not forward traffic — use the netstack engine for real shaping.
  • Battery optimization should be disabled on aggressive OEM ROMs (Xiaomi, Huawei, Oppo, Vivo, Samsung). NetValve detects this and offers guidance.

Not Yet Implemented (Roadmap)

  • Warning-threshold notifications — infrastructure ready, no notifications yet
  • Domain filteringDnsCache populated, no DomainFilterModule yet
  • Per-app quotas — daily/monthly data caps (planned)
  • Adaptive throttling — auto-adjust caps based on network conditions

See the full list in docs/LIMITATIONS.md.


🧪 Testing

Test type Status Notes
JVM unit tests 33/33 passing 7 suites, runs on plain JDK 17
Compose UI tests ✅ compiles Requires emulator/device
Build verification ✅ verified See docs/BUILD_VERIFICATION.md
Netstack forwarding ✅ verified on real sockets See docs/NETSTACK_EVIDENCE.md
On-device validation ⏳ pending Needs physical device
# Run unit tests
./gradlew :app:testDebugUnitTest

🛠️ Technical Highlights

For developers interested in the internals:

  • 100% Kotlin, MVVM with Coroutines/Flow
  • Hilt for dependency injection
  • DataStore (settings/rules) + Room (stats/logs)
  • Jetpack Compose with Material 3
  • minSdk 29 (Android 10), targetSdk 35 (Android 15)
  • gVisor netstack via gomobile bridge for production forwarding
  • Token-bucket throttling with lazy refill (no timers)
  • Suspend-to-pace design — no busy-wait, no packet drops
  • Framework-free core — rules, throttle, stats, log modules testable on plain JVM

Full architecture: docs/ARCHITECTURE.md


📋 Permissions Used

Permission Why
VPN consent Create the local tunnel (required)
FOREGROUND_SERVICE + FOREGROUND_SERVICE_SPECIAL_USE Host the tunnel as a typed FGS
POST_NOTIFICATIONS (Android 13+) Show ongoing status notification
PACKAGE_USAGE_STATS Detect foreground app for "background-only" rules
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS Survive Doze / OEM killers
QUERY_ALL_PACKAGES List installed apps to control
RECEIVE_BOOT_COMPLETED Re-arm tunnel after reboot (opt-in)

No internet permission is used for telemetry — only to forward controlled apps' own traffic. No analytics, no trackers, no ads.


🤝 Contributing

Issues and pull requests welcome! See CONTRIBUTING.md for guidelines.

How You Can Help

  • 🐛 Report bugs — open an issue with reproduction steps
  • 💡 Suggest features — open an issue with use-case description
  • 🔧 Submit PRs — fork, branch, push, PR
  • 📖 Improve docs — fix typos, clarify, translate
  • 🧪 Test on devices — especially OEM ROMs (Xiaomi, Huawei, etc.)
  • 📸 Add screenshots — see docs/screenshots/README.md

📚 Documentation


🙏 Acknowledgments

  • gVisor — production-grade userspace TCP/IP stack
  • gomobile — Go → Android binding toolchain
  • AndroidX & Jetpack Compose — UI framework
  • Hilt — dependency injection
  • Kotlin Coroutines — async/concurrency
  • sagernet/gvisor — Go fork that is plain-go/gomobile buildable

📄 License

Copyright 2026 The NetValve Authors
Licensed under the Apache License, Version 2.0

See LICENSE for the full text.

NetValve bundles no ads, trackers, or analytics, and depends on no proprietary SDKs.


⭐ Star the Repo

If you find NetValve useful, consider starring the repo to help others discover it:

👉 https://github.com/IEAmir/NetValve


Full Changelog: Initial release.