How net-merge/android works
net-merge is an Android local VPN that keeps Wi-Fi and mobile data available, then distributes separate app connections across them. The workflow runs from the power control or Quick Settings tile through the VPN service, which tracks networks and sends their details to the Go engine; the engine forwards traffic and reports per-network stats for the UI. The graph includes the documented VPN, balancing, probing, and socket-binding stages. Some Go internal call relationships are not shown because the sampled excerpts do not establish them.
Main entry points: MergeVpnService.kt VPN service · Engine.kt Shared app state · netmerge.go Go mobile API · MainActivity.kt Main activity
Components 19
App controls
- Main activity
app/src/main/java/org/netmerge/android/MainActivity.kt - Quick Settings tile
app/src/main/java/org/netmerge/android/MergeTileService.kt - Main screen
app/src/main/java/org/netmerge/android/ui/MainScreen.kt - Power button
app/src/main/java/org/netmerge/android/ui/PowerButton.kt - Live chart
app/src/main/java/org/netmerge/android/ui/LiveChart.kt
Android runtime
- VPN service
app/src/main/java/org/netmerge/android/MergeVpnService.kt - Network tracker
app/src/main/java/org/netmerge/android/NetworkTracker.kt - VPN interface
app/src/main/java/org/netmerge/android/MergeVpnService.kt
Engine interface
- Go mobile API
golib/netmerge/netmerge.go
Traffic engine
- TUN forwarding
golib/internal/tun/forward.go - Flow balancer
golib/internal/engine/balancer.go - Flow scheduler
golib/internal/engine/sched.go - Internet probes
golib/internal/engine/probe.go - Flow connections
golib/internal/engine/flowconn.go - SOCKS5 handling
golib/internal/engine/socks5.go - Network-bound sockets
golib/internal/nics/egress_android.go
Status and telemetry
- Shared app state
app/src/main/java/org/netmerge/android/Engine.kt - Stats parser
app/src/main/java/org/netmerge/android/Stats.kt
Other components
- User
Connections 26
- User → Main activity: opens app
README.md - User → Quick Settings tile: toggles merging
README.md - Main activity → Main screen: renders
app/src/main/java/org/netmerge/android/MainActivity.kt - Main screen → Power button: renders
app/src/main/java/org/netmerge/android/ui/MainScreen.kt - Main screen → Live chart: renders
app/src/main/java/org/netmerge/android/ui/MainScreen.kt - Main activity → VPN service: starts or stops
app/src/main/java/org/netmerge/android/MainActivity.kt - Quick Settings tile → VPN service: starts or stops
app/src/main/java/org/netmerge/android/MergeTileService.kt - VPN service → Network tracker: starts tracking
app/src/main/java/org/netmerge/android/MergeVpnService.kt - Network tracker → VPN service: reports networks
app/src/main/java/org/netmerge/android/MergeVpnService.kt - VPN service → VPN interface: establishes
app/src/main/java/org/netmerge/android/MergeVpnService.kt - VPN service → Go mobile API: sets networks
app/src/main/java/org/netmerge/android/MergeVpnService.kt - VPN service → Shared app state: updates phase
app/src/main/java/org/netmerge/android/MergeVpnService.kt - Shared app state → Go mobile API: sets balancing mode
app/src/main/java/org/netmerge/android/Engine.kt - Shared app state → Go mobile API: reads engine stats
app/src/main/java/org/netmerge/android/Engine.kt - Go mobile API → Shared app state: returns stats
app/src/main/java/org/netmerge/android/Engine.kt - Shared app state → Stats parser: parses stats
app/src/main/java/org/netmerge/android/Engine.kt - Main activity → Shared app state: observes state
app/src/main/java/org/netmerge/android/MainActivity.kt - Main screen → Shared app state: displays state
app/src/main/java/org/netmerge/android/ui/MainScreen.kt - Go mobile API → TUN forwarding: starts TUN forwarding
golib/netmerge/netmerge.go - Go mobile API → Flow scheduler: updates networks and ticks
golib/netmerge/netmerge.go - TUN forwarding → Flow balancer: forwards through
README.md - Flow balancer → Flow scheduler: selects flows
- Flow scheduler → Internet probes: checks links
- Flow balancer → Flow connections: manages flows
- Flow connections → SOCKS5 handling: handles proxy flows
- Flow connections → Network-bound sockets: opens bound sockets
README.md