wgtunnel/android
58.5
Adequate · 28 September 2026
26.2k
lines of production code
Kotlin
primary language
2
measurements over time
What this system is
WG Tunnel is an Android application that manages WireGuard and AmneziaWG VPN connections with a focus on automatic network-triggered tunneling. It provides granular control over split tunneling, DNS policies, proxy settings, and lockdown modes, while maintaining connection reliability through background reconciliation and seamless recovery mechanisms. The system features a modern, modular architecture with a comprehensive UI for configuring tunnel groups, monitoring statistics, and managing in-app updates.
How it got here
2023 — modernization and modular architecture
26 changes.
The project underwent a comprehensive modernization, migrating the codebase to Jetpack Compose, Room, and Koin while rebranding to WG Tunnel. This period saw the removal of legacy components like Firebase and ObjectBox, alongside the adoption of a modular architecture and updated build infrastructure.
2024–2025 — Architecture modernization and feature expansion
58 changes.
The project underwent a comprehensive architectural overhaul, migrating dependency injection to Koin, state management to Orbit MVI, and navigation to Navigation3, while restructuring the data layer with granular Room entities and domain models. This foundation enabled significant feature additions, including tunnel grouping, split tunneling, in-app updates, and detailed DNS and proxy configuration screens. The work also standardized the UI with a new component library and improved reliability through robust network monitoring and background workers.
2026 — orchestration and configuration overhaul
10 changes.
The project implemented a centralized orchestration layer to manage tunnel lifecycles, boot restoration, and auto-tunnel reconciliation, significantly improving reliability and state management. This architectural shift was accompanied by a comprehensive redesign of the tunnel configuration UI, introducing granular editing, syntax highlighting, and privacy controls. Additionally, the update enhanced connectivity monitoring with a TCP-based pinger, IPv6 fallback logic, and a robust notification system for real-time status updates.
Features
Add app licenses screen with native dependency attribution
The app now includes a dedicated licenses screen that displays open-source attributions using the AboutLibraries library. This screen specifically includes native dependencies such as the AmneziaWG Go fork, Wireproxy AWG, go-socks5, miekg/dns, and hev-socks5-tunnel, alongside standard Android libraries like QuickieFoss and libsu, ensuring proper credit and license compliance for all bundled components.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/license · high confidence
Add crypto address display component with copy and expand functionality
The donation screen now includes a dedicated UI component for displaying cryptocurrency wallet addresses. This new component presents the address name and icon, allows users to tap to expand the full address string for visibility, and provides a copy button to easily copy the wallet address to the clipboard.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/donate/crypto/components · high confidence
Added common UI label components for consistent styling
The app now includes a set of reusable Compose UI components in the common label package to standardize text display. GroupLabel renders a bold, primary-colored title using the Material 3 typography system, while SelectedLabel displays a checkmark icon aligned to the end of its container. Additionally, a lowercaseLabel utility function is provided to ensure consistent locale-aware text casing across the interface.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/label · high confidence
Added in-app donation and cryptocurrency support assets
The app now supports in-app donations via cryptocurrency and third-party platforms. This update adds the necessary UI assets, including vector drawables for Bitcoin, Bitcoin Cash, Ethereum, Litecoin, Monero, Solana, Stellar, Tron, Zcash, and Bitcoin Lightning, as well as logos for Ko-fi, Liberapay, and Matrix. It also introduces new status icons for auto-tunnel pause/play states and a Lottie animation for the empty state.
app/src/main/res · high confidence
Background workers for auto-tunnel reconciliation and standalone update checks
The app now uses two new background workers to improve reliability and user awareness. ServiceWorker runs every 15 minutes to reconcile the auto-tunnel state, ensuring the tunnel service is restarted if it was killed while auto-tunnel is enabled. UpdateCheckWorker runs daily (at 04:04 UTC) exclusively in the standalone flavor to check for app updates and notify the user if a new version is available.
app/src/main/java/com/zaneschepke/wireguardautotunnel/core/worker · high confidence
In-app crypto donation addresses added
The app now includes a dedicated screen for cryptocurrency donations, allowing users to view and copy wallet addresses for Bitcoin, Monero, Ethereum, and several other supported coins directly within the app.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/donate/crypto · high confidence
Introduce dedicated logcat capture and management library
The logcatter module now provides a complete, lifecycle-aware system for capturing, storing, and exporting Android logcat data. It introduces a LogcatManager that streams logs filtered by configurable noisy tags and patterns, automatically rotating files based on size limits and packaging them into zipped archives for export. This change establishes the foundational infrastructure for the new logs screen and improved logging capabilities, ensuring logs are persisted locally with version and flavor metadata while keeping the in-memory buffer manageable.
logcatter · high confidence
Introduce dedicated network monitoring module with multi-method Wi-Fi detection
A new \networkmonitor\ module has been added to the project, providing a robust \AndroidNetworkMonitor\ implementation that tracks connectivity state, including Wi-Fi, cellular, and Ethernet networks. The module supports multiple Wi-Fi detection methods—Default, Legacy, Root, and Shizuku—to ensure reliable network status reporting across various Android versions and OEM-specific behaviors (such as Samsung, Xiaomi, and Vivo devices). It includes detailed state tracking for location permissions, airplane mode, and DNS information, along with a \StableNetworkEngine\ to debounce rapid network changes. The module also integrates Shizuku support for privileged shell commands and handles edge cases like captive portals and permission changes.
networkmonitor · high confidence
Introduce structured domain state models for tunnel and network monitoring
This change introduces new data classes in the domain state layer to better represent the application's internal state. AutoTunnelState now includes debounced flags for captive portal and usable network detection to prevent flapping on unstable connections. NetworkState is updated to explicitly track location permissions and service status alongside network connectivity. Additionally, new models for LogHealthState and TunnelStatistics (including PeerStats) are added to support more granular health reporting and statistics tracking for active tunnels.
app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/state · high confidence
Introduction of LocalSideEffect sealed class for UI actions
The app now defines a centralized \LocalSideEffect\ sealed class to manage various user interface actions and side effects. This change introduces specific capabilities for saving changes, displaying sensitive information, copying content to the clipboard, and launching export pickers. It also standardizes the handling of UI sheets (such as adding menus, importing tunnels, moving tunnels to groups, and managing selection or logger actions) and modals (including QR code display, tunnel selection, and recovery details). Additionally, it provides a mechanism for handling bulk actions on selected tunnels, such as selecting all or copying them.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/sideeffect · high confidence
Introduction of the AutoTunnel service and reconciliation logic
This change introduces the core components for the new AutoTunnel feature, including the \AutoTunnelService\ which manages the background lifecycle, the \AutoTunnelReconciler\ that handles tunnel start/stop decisions, and the \AndroidAutoTunnelHost\ that bridges network state changes to the tunnel coordinator. The implementation adds logic to stabilize network identity detection, debounce captive portal and connectivity state changes to prevent flapping, and supports new settings such as disabling tunnels on captive portals and trusting specific BSSIDs.
app/src/main/java/com/zaneschepke/wireguardautotunnel/service/autotunnel · high confidence
New Appearance settings screen
A new Appearance settings screen has been added, providing users with a centralized location to manage display preferences. This screen includes options to change the app language, adjust the display theme, and configure notification settings, each accessible via dedicated navigation rows.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/appearance · high confidence
New Auto Tunnel configuration screen with location and battery optimization controls
The app introduces a dedicated Auto Tunnel screen (AutoTunnelScreen.kt) that allows users to manage the auto-tunnel state, start/stop the service, and handle prerequisite system settings. This screen explicitly checks for and warns about missing location permissions and disabled location services, providing direct links to fix these issues, and includes functionality to request disabling battery optimizations to ensure reliability. It also exposes side effects for saving BSSID and SSID data (AutoTunnelScreenSideEffect.kt).
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/autotunnel · high confidence
New DNS settings screen with configurable tunnel and system DNS options
A new DNS settings screen has been added to the app, allowing users to configure how DNS resolution works for tunnels. Users can now select the bootstrap DNS protocol (e.g., system or specific protocols) and choose the tunnel DNS mode via a bottom sheet. The screen also displays current system DNS information, including private DNS status (automatic, hostname, or off), and warns users if private DNS is enabled while a tunnel DNS mode is active, providing a link to fix the conflict in system settings.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/dns · high confidence
New IPv6 endpoint settings screen with automatic fallback
A new settings screen has been added for configuring IPv6 endpoint behavior. Users can now toggle 'Prefer IPv6' to prioritize IPv6 addresses, and when this is enabled, a 'Restore IPv6' option becomes available to allow automatic fallback to IPv4 if the IPv6 connection fails. This change implements the automatic fallback logic for IPv6-preferred endpoints as described in the commit messages.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/settings/ipv6 · high confidence
New Lockdown Settings screen for kill switch configuration
A new LockdownSettingsScreen has been added to the application, providing users with a dedicated interface to manage kill switch behavior. This screen allows users to toggle LAN traffic bypass, enable dual-stack support, and, on Android 10 and later, configure metered tunnel settings. The UI integrates with the LockdownViewModel to handle state and triggers a restart confirmation dialog when changes are saved.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/lockdown · high confidence
New QR code dialog and TCP-based pinger module for tunnel connectivity
Users can now share tunnel configurations via a new QR code dialog that displays the tunnel's quick-config data in a styled, full-screen dialog with adjusted screen brightness for better visibility. Additionally, the app introduces a new pinger module that uses TCP connection attempts (instead of ICMP) to monitor tunnel reachability, supporting configurable targets, timeouts, and SOCKS5 proxy authentication to verify connectivity.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/settings/config/components, pinger · high confidence
New Quick Settings tiles for tunnel and auto-tunnel control
Users can now manage their VPN connection directly from the Android Quick Settings panel. A new Tunnel Control tile allows toggling the active tunnel and displays the tunnel name and connection state as a subtitle on Android 10+. A separate Auto-Tunnel Control tile enables toggling the auto-tunnel feature and reflects its active/inactive status. Both tiles include robust state synchronization and handle edge cases, such as preventing crashes on certain OEM devices and Android 13+ work profiles during refresh.
app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tile · high confidence
New UI banner components for alerts and warnings
The app introduces two new Compose UI components in the common banner package: AppAlertBanner, a simple styled text banner for general alerts, and WarningBanner, an animated component that displays a warning title with a leading icon and optional trailing content. These components provide a standardized way to present alert and warning messages to users within the application interface.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/banner · high confidence
New UI components for disabled text states and log type labels
The app introduces two new Compose UI components in the common text package: DescriptionText, which renders body text with a distinct visual style when a disabled state is active, and LogTypeLabel, which displays content within a small, rounded, colored box to visually categorize log entries.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/text · high confidence
New Wi-Fi settings screen with BSSID and captive portal controls
The app introduces a dedicated Wi-Fi settings screen that allows users to manage trusted network rules by both SSID and BSSID, toggle wildcard support for flexible matching, and enable a new option to automatically disable the tunnel when a captive portal is detected. This screen also provides access to the Wi-Fi detection method configuration and tunnel mapping preferences.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/autotunnel/wifi · high confidence
New app mode selection bottom sheet for proxy settings
A new AppModeBottomSheet component has been added to the proxy settings UI, allowing users to select between VPN, Local Proxy, and Lock Down tunnel modes via a bottom sheet dialog. This component renders the available TunnelMode enum options with their respective icons, titles, and descriptions, and handles the selection callback to update the tunnel mode.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/proxy/compoents · high confidence
New broadcast receivers for notifications, remote control, restart, and updates
The app now includes four new broadcast receivers in the core broadcast package to handle system and external events more robustly. NotificationActionReceiver processes notification buttons to stop tunnels or disable auto-tunneling. RemoteControlReceiver enables external apps to start, stop, or toggle tunnels and auto-tunneling via custom intents, subject to a configured remote key. RestartReceiver handles device boot and package replacement events to restore state and clear logs. UpdateDownloadReceiver listens for system download manager events to complete in-app updates and handle notification clicks.
app/src/main/java/com/zaneschepke/wireguardautotunnel/core/broadcast · high confidence
New custom text field components for configuration screens
The app introduces two new Compose UI components, CustomTextField and ConfigurationTextBox, within the common textbox package. These components provide a unified, styled text input experience with custom focus handling, cursor visibility, and a floating label design, replacing previous implementations to ensure consistent appearance and behavior across configuration inputs.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/textbox · high confidence
New dedicated logs screen with auto-scroll and export capabilities
A new LogsScreen has been introduced in the settings section, providing a dedicated interface for viewing tunnel logs. The screen features an auto-scrolling list that follows new log entries but allows users to pause scrolling by manually scrolling up. It includes a bottom sheet for exporting logs to a file or deleting them, and displays an empty state animation when no logs are available.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs · high confidence
New display settings screen for theme selection
A new DisplayScreen has been added to the settings appearance section, allowing users to choose from multiple theme options including Dark, Light, Automatic, Dynamic, Darker, and AMOLED. The screen uses Koin for dependency injection to access the shared app view model and presents the available themes as selectable rows, with a checkmark indicating the currently active theme.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/appearance/display · high confidence
New fastlane configuration for Google Play Store deployments
Added fastlane setup (Appfile and Fastfile) to automate Android releases to the Google Play Store. The configuration includes lanes for internal, alpha, beta, and production tracks, featuring a metadata preparation step that filters out incomplete locale listings to prevent Play Store rejections, and supports separate workflows for building/uploading the app bundle and publishing store listing metadata.
fastlane · high confidence
New in-app donation screen with crypto and sponsor options
A new DonateScreen has been added to the app's support section, allowing users to view and manage donation preferences directly within the interface. For non-Google Play builds, the screen provides access to cryptocurrency addresses via a dedicated navigation route and direct links to GitHub Sponsors, Liberapay, and Ko-fi. Google Play builds display a specific message instead of these external options. Additionally, users can toggle a switch to indicate they have already donated, which updates the app's settings state.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/donate · high confidence
New in-app update UI components
Added three new Compose UI components to the support screen: PermissionDialog for requesting install permissions, UpdateDialog for displaying update availability and download progress, and UpdateDownloadStatus for showing download status text and progress indicators. These components provide the user interface for the in-app update flow, including handling permission requests, displaying version information with clickable release notes, and showing download progress with a wavy progress indicator.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/components · high confidence
New in-app updater with robust download handling
The app now includes a new in-app update mechanism that checks for and downloads new versions directly. This change introduces a dedicated Ktor-based HTTP client and a streaming file downloader to handle large APK downloads reliably, featuring progress reporting, stall detection, and atomic file replacement to prevent corruption. It also adds a GitHub API interface to fetch release information, enabling the app to detect and install updates without leaving the application.
app/src/main/java/com/zaneschepke/wireguardautotunnel/data/network · high confidence
New language selection screen in settings
A new LanguageScreen has been added to the settings appearance section, allowing users to manually select the app's display language from a sorted list of supported locales or choose to follow the system (phone) language. The screen integrates with the SharedAppViewModel to persist the selection and uses Koin for dependency injection, replacing previous ad-hoc implementations with a dedicated Compose UI.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/appearance/language · high confidence
New log viewing and export interface
The logs settings screen now features a dedicated bottom sheet for managing log data, offering users the ability to export logs as a timestamped ZIP file (when SAF is supported) or delete them entirely. The log display itself has been replaced with a new scrollable list component that renders individual log entries with formatted timestamps, color-coded severity levels, and truncated tags, allowing users to tap any entry to copy its content to the clipboard.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/logs/components · high confidence
New proxy settings screen for SOCKS5 and HTTP configuration
Users can now configure proxy settings directly within the app via a new ProxySettingsScreen. This screen allows enabling and configuring SOCKS5 and HTTP proxies, including bind addresses, usernames, and passwords, with validation and password visibility toggles. Changes require a restart to apply if active tunnels are present.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/proxy · high confidence
New reusable animation components for UI feedback
The app introduces two new Compose components in the common animations package to enhance visual feedback. AnimatedFloatIcon provides a reusable icon switcher that scales and fades between active and inactive states, supporting the improved bottom navigation icon animations. EmptyStateLottie offers a standardized way to display Lottie-based loading or empty states with a customizable message, replacing ad-hoc implementations in screens like the tunnel list.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/animations · high confidence
New reusable bottom sheet component for selection options
A new \CustomBottomSheet\ composable has been added to the common UI library, providing a reusable modal bottom sheet for presenting a list of selectable options. This component renders each option with a leading icon, title, optional description, and a checkmark indicator for the selected item, and it automatically adjusts its expansion behavior (skipping partial expansion) when running on Android TV.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/sheet · high confidence
New reusable dropdown selection components
The app introduces two new Compose UI components, DropdownSelector and LabeledDropdown, to standardize how users select options from a list. DropdownSelector provides a generic, scrollable dropdown menu with customizable labels and value formatting, while LabeledDropdown wraps this functionality in a surface row with a title, description, and leading icon, making it easier to integrate selection controls into configuration views.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/dropdown · high confidence
New screen for selecting preferred tunnels by network type
A new PreferredTunnelScreen has been added to allow users to explicitly choose a preferred WireGuard tunnel for Mobile Data and Ethernet connections. The interface displays available tunnels and lets the user select one as the default for these specific network types, with the selection persisting until changed. For Wi-Fi networks, the screen supports selecting a tunnel and then configuring specific SSID/BSSID rules via a NetworkRuleInput component, enabling granular control over which Wi-Fi networks trigger the selected tunnel.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/autotunnel/preferred · high confidence
New settings UI components for backup and help links
This change introduces three new Compose UI components in the settings screen: a bottom sheet for triggering backup and restore actions, a dialog that allows users to toggle encryption and set a password for backups, and a clickable 'Learn more' text label. These components provide the user interface for the backup workflow and informational links within the app settings.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings/components · high confidence
New split tunnel configuration screen with copy functionality
A new SplitTunnelScreen has been introduced to manage split tunnel settings, featuring a loading state with a wavy progress indicator and integration with the app's side-effect system for save operations. The screen allows users to select a copy source from existing tunnels via a modal dialog, enabling them to duplicate split tunnel configurations, and provides a content view for toggling individual app packages within the split tunnel.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/splittunnel · high confidence
New trusted network input component for auto-tunnel settings
A new \TrustedNetworkTextBox\ composable has been added to the auto-tunnel UI components, providing a user interface for managing a list of trusted Wi-Fi networks. This component allows users to view existing trusted networks as removable tags, enter new network names via a text field, and save them, with automatic scrolling to keep the input field visible when the list changes.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/autotunnel/components · high confidence
New tunnel configuration editing screen with scrollable layout
A new ConfigEditScreen has been introduced for editing WireGuard tunnel configurations. This screen provides a scrollable interface for managing interface settings, peers, and global options like DNS and Amnezia protocols. It includes specific UI adjustments such as IME padding for better keyboard interaction and scrollbars for navigation, particularly on Android TV devices.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/settings/config/edit · high confidence
New tunnel configuration view with syntax highlighting and privacy controls
A new ConfigScreen has been added to the tunnel settings, allowing users to view their WireGuard configuration with syntax highlighting for headers, keys, and comments. The view supports live updates when the tunnel is active, includes a toggle to mask sensitive keys (PrivateKey, PresharedKey) for privacy, and provides options to copy the config to the clipboard or generate a QR code.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/settings/config · high confidence
New tunnel settings screen with mode-aware feature toggles
A new TunnelSettingsScreen has been introduced to centralize tunnel configuration options. The interface allows users to view the tunnel configuration and live status, toggle the primary tunnel status, and manage network settings including split tunneling, IPv6, and metered tunnel preferences. Notably, the metered tunnel option is conditionally enabled only on Android 10 (API 29) and above, and is disabled when the tunnel mode is set to PROXY, with appropriate UI feedback provided for unavailable features.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/settings · high confidence
New utility library for configuration, file handling, and localization
The app introduces a new set of utility classes in the \util\ package to standardize core operations. \BssidUtils\ now handles the normalization and validation of Wi-Fi BSSID patterns, including support for wildcard rules. \FileUtils\ provides robust, asynchronous methods for creating, zipping, and exporting configuration files, with specific fallback logic for Android TV and legacy devices. \LocaleUtil\ manages per-app language settings, ensuring compatibility with Android 13+ system locale persistence. Additionally, \Constants\ centralizes build flavor definitions, \Exceptions\ defines specific error types for file operations, \NumberUtils\ handles semantic version comparison, \ReleaseTree\ suppresses debug logging in production, and \StringValue\ offers a flexible way to resolve dynamic or resource-based strings.
app/src/main/java/com/zaneschepke/wireguardautotunnel/util · high confidence
Re-enabled app shortcuts with new dynamic shortcut manager
The app now supports dynamic home-screen shortcuts to quickly start or stop the VPN tunnel and the auto-tunnel connectivity watcher. A new DynamicShortcutManager creates and manages these shortcuts, which launch a dedicated ShortcutsActivity to handle the actions. This change restores shortcut functionality that was previously broken, ensuring users can toggle the VPN state directly from their device's home screen.
app/src/main/java/com/zaneschepke/wireguardautotunnel/core/shortcut · high confidence
Redesigned tunnel management with grouping and selection capabilities
The Tunnels screen now supports organizing tunnels into groups, allowing users to create, rename, and move tunnels between groups via dedicated UI components. A new selection mode enables batch operations such as copying, exporting, and deleting multiple tunnels at once, while improved navigation and state handling ensure smoother interactions during these bulk actions.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels · high confidence
Structured error handling and unified event notifications for tunnel operations
The app now uses a structured \TunnelErrorEvent\ system to categorize tunnel failures (such as VPN permission denials, internal backend errors, and port unavailability) and dispatches them via a new \TunnelEventDispatcher\. This change ensures that both informational events (like IPv4 fallbacks or DNS updates) and error states are consistently communicated to the user through synchronized snackbar and notification updates, improving visibility into tunnel status and recovery attempts.
app/src/main/java/com/zaneschepke/wireguardautotunnel/core/event · high confidence
Tunnel grouping and enhanced list management
The tunnels screen now supports organizing connections into groups. Users can create, rename, export, and delete groups, as well as move individual tunnels between groups or ungroup them via the selection actions sheet. The tunnel list itself has been redesigned to display these groups with collapsible headers, supports drag-and-drop reordering of both tunnels and groups, and includes a new empty-state guide. Additionally, the tunnel detail view now displays connection uptime and peer statistics, including transfer volumes and handshake times.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components · high confidence
Removals
Removal of legacy WireGuard tunnel implementation
The \VpnService\ interface and its \WireGuardTunnel\ implementation have been removed from the application. This deletion eliminates the previous code path that managed tunnel state and configuration via the \com.wireguard.android.backend\ library, indicating a shift away from this specific backend integration.
app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel · high confidence
Removal of legacy foreground service infrastructure
The app has removed the \service/foreground\ package, deleting the \Action\ and \ServiceState\ enums, the base \ForegroundService\ class, the \ServiceTracker\ helper, and the specific \WireGuardConnectivityWatcherService\ and \WireGuardTunnelService\ implementations. This eliminates the previous mechanism where these services managed foreground notifications, wake locks, and intent-based start/stop actions for VPN tunneling and network monitoring.
app/src/main/java/com/zaneschepke/wireguardautotunnel/service/foreground · high confidence
Removal of legacy notification service interface and implementation
The legacy \NotificationService\ interface and its \WireGuardNotification\ implementation have been removed from the application. This change eliminates the previous mechanism for creating standard foreground notifications with vibration and light settings, indicating a shift in how the app manages its persistent status indicators or notification channels.
app/src/main/java/com/zaneschepke/wireguardautotunnel/service/notification · high confidence
Removed legacy network monitoring service classes
The \BaseNetworkService\, \MobileDataService\, \WifiService\, \NetworkService\ interface, and \NetworkStatus\ sealed class in the \service/network\ package have been deleted. This removes the previous implementation of connectivity monitoring that relied on \ConnectivityManager\ callbacks and specific Android version checks for Wi-Fi SSID retrieval, indicating a shift to a different network monitoring approach elsewhere in the application.
app/src/main/java/com/zaneschepke/wireguardautotunnel/service/network · high confidence
Architecture
Centralized orchestration for tunnel lifecycle, boot restoration, and settings synchronization
The app now uses a new set of coordinator classes in the core orchestration module to manage tunnel operations. AppBoostrapCoordinator handles initial setup, including DNS configuration and restoring lockdown/kill-switch modes on startup. StartupCoordinator manages boot-time and sticky-restart restoration of tunnels and auto-tunnel services, ensuring the correct tunnel state is resumed after device reboots or service crashes. TunnelCoordinator centralizes tunnel start/stop logic, applies live feature updates (such as statistics and seamless recovery) to active tunnels, and handles user overrides. AutoTunnelCoordinator manages the auto-tunnel service lifecycle, while DnsSettingsCoordinator applies DNS bootstrap settings to the backend. ShortcutCoordinator handles app shortcuts for starting/stopping tunnels and auto-tunnel services. FileExportCoordinator manages file exports with proper permission checks and user feedback. TunnelBackendCoordinator handles switching between tunnel modes (VPN, Proxy, Lockdown). This refactoring consolidates complex logic into dedicated coordinators, improving reliability and maintainability of tunnel management.
app/src/main/java/com/zaneschepke/wireguardautotunnel/core/orchestration · high confidence
Database schema restructured into granular settings and tunnel management DAOs
The application's data access layer has been reorganized to support new configuration and tunnel management capabilities. New Data Access Objects (DAOs) have been introduced to handle specific settings domains, including AutoTunnel, DNS, General, Lockdown, Monitoring, and Proxy settings, allowing for more targeted updates to features like captive portal handling, DNS configuration, and recovery delays. Additionally, the TunnelConfigDao has been expanded to support tunnel grouping, metered network detection, DDNS tunnel identification, and primary tunnel selection, while a new TunnelGroupDao manages group ordering and expansion states.
app/src/main/java/com/zaneschepke/wireguardautotunnel/data/dao · high confidence
Migrate dependency injection from Dagger/Hilt to Koin
The app's dependency injection system has been replaced with Koin, introducing a new modular structure in the \di\ package (including \AppModule\, \CoordinatorModule\, \DatabaseModule\, \NetworkModule\, \TunnelModule\, and \WorkerModule\). This change updates how core components like ViewModels, repositories, and network services are wired together, and adds an \AppVisibilityObserver\ to track application foreground/background state for lifecycle-aware features.
app/src/main/java/com/zaneschepke/wireguardautotunnel/di · high confidence
Migrate tunnel core to new shared backend and core
The tunnel core module has been refactored to integrate with a new shared backend and core library. This change introduces a new \TunnelProvider\ interface and its \TunnelBackendProvider\ implementation to handle tunnel lifecycle operations (start, stop, update, lockdown) and status monitoring via the new backend. It also adds an \AppProvider\ to manage persistent notifications, including support for live updates and detailed tunnel status lines, and a \TunnelOriginHolder\ to track the source of tunnel actions. This migration replaces the previous tunnel handling logic with the new shared infrastructure.
app/src/main/java/com/zaneschepke/wireguardautotunnel/core/tunnel · high confidence
Migrated viewmodels to Orbit MVI state management
The app's viewmodels (including AutoTunnel, ConfigEdit, Dns, Lockdown, Logger, Monitoring, ProxySettings, Settings, and SharedApp) have been rewritten to use the Orbit MVI library. This change introduces a structured state container for each screen, replacing previous state management approaches with a consistent, declarative flow-based architecture that improves state consistency and simplifies side-effect handling across the application.
app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel · high confidence
New data mappers for settings, tunnel, and app state models
This change introduces a suite of new mapper classes in the data layer to handle the conversion between database entities and domain models. Specifically, it adds mappers for auto-tunnel settings (including WiFi/BSSID detection and captive portal controls), DNS settings (covering split DNS, foreign DNS policies, and bootstrap endpoints), general application state, GitHub release updates, lockdown mode (LAN bypass, metered networks, dual-stack), monitoring statistics, proxy configurations, and tunnel groups. These mappers support the underlying architectural shift to a cleaner domain-driven design, enabling features like seamless recovery, tunnel sorting, and granular network controls without exposing internal data structures to the UI or business logic.
app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper · high confidence
Removal of legacy ObjectBox and Dagger Hilt dependency modules
The application has removed the Dagger Hilt modules (BoxModule, RepositoryModule, ServiceModule, and TunnelModule) that previously provided dependencies for the ObjectBox database, repository bindings, network services, and the WireGuard Go backend. This change eliminates the ObjectBox persistence layer and its associated dependency injection wiring from this module, indicating a shift away from ObjectBox (likely to Room, as suggested by commit history) and a restructuring of how core services and backends are instantiated.
app/src/main/java/com/zaneschepke/wireguardautotunnel/module · high confidence
Repository layer refactored into granular, domain-specific interfaces
The application's data access layer has been restructured from a monolithic approach into a set of specialized repositories, each managing a distinct aspect of the app's state and configuration. This change introduces dedicated interfaces for managing app state flags (e.g., location disclosure, battery optimization), specific settings domains (auto-tunnel, DNS, general, lockdown, monitoring, proxy), and core tunnel management (tunnel configs, tunnel groups, selected tunnels). Additionally, new repositories handle system-level concerns such as installed package tracking, global side-effect broadcasting, and in-app update downloading. This separation allows for more focused state management and clearer boundaries between different functional areas of the WireGuard AutoTunnel app.
app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/repository · high confidence
Repository layer refactored to use Room and DataStore with new update and package management
The data repository layer has been restructured to use Room for persistent storage and DataStore for app state, introducing new implementations for managing app updates (including APK asset selection and DownloadManager integration) and tracking installed packages. This change replaces previous storage mechanisms with a more robust, flow-based architecture for settings, tunnel configurations, and system state.
app/src/main/java/com/zaneschepke/wireguardautotunnel/data/repository · high confidence
Behavioural changes
App architecture migrated to Jetpack Compose, Navigation3, and Room
The app's user interface and data layer have been completely rebuilt. The legacy Android Views and Dagger/Hilt dependency injection have been replaced with a modern Jetpack Compose UI, Navigation3 for routing, and Koin for dependency injection. Data persistence has migrated from ObjectBox to Room, introducing new screens for PIN lock, location disclosure, and split-tunnel configuration, while removing the old BootReceiver and repository implementations.
app/src/main/java/com/zaneschepke/wireguardautotunnel · high confidence
Configured Gradle Daemon JVM toolchains
A new gradle-daemon-jvm.properties file has been added to configure the Java toolchain for the Gradle daemon. This file maps specific operating systems and architectures (such as Linux, macOS, and Windows on AARCH64 and X86\_64) to JDK distribution URLs via the Foojay Disco API, and sets the target JDK version to 21.
gradle · high confidence
Database schema restructured with new settings and tunnel management entities
The application's data layer has been reorganized into distinct Room entities to support expanded configuration and management capabilities. New entities include AutoTunnelSettings for granular network trigger controls (Wi-Fi, Ethernet, mobile data), DnsSettings for split-DNS and proxy configurations, and LockdownSettings for dual-stack and metered network handling. Tunnel management is enhanced with TunnelGroup and TunnelConfig entities, introducing grouping, sorting, and global configuration overrides. Additional entities like MonitoringSettings, ProxySettings, and GeneralSettings centralize preferences for statistics, proxy bindings, and UI behavior, while AppState and GitHubRelease entities support in-app update flows and user onboarding state.
app/src/main/java/com/zaneschepke/wireguardautotunnel/data/entity · high confidence
Database schema restructured with new settings entities and migration to version 40
The app's local data layer has been reorganized to support new configuration capabilities. The Room database schema has been bumped to version 40, introducing dedicated tables for proxy, monitoring, lockdown, and DNS settings, alongside tunnel groups. This change includes a comprehensive set of auto-migrations that remove legacy columns (such as old battery saver and WiFi detection flags), rename fields for clarity (e.g., \is\_ping\_enabled\ to \restart\_on\_ping\_failure\), and clean up deprecated settings. A new \DataStoreManager\ has been added to handle simple preference flags like notification permission status, separating them from the complex Room entities. Users benefit from a more robust data structure that supports features like proxy lockdown, detailed tunnel monitoring, and split DNS policies without losing existing configuration during updates.
app/src/main/java/com/zaneschepke/wireguardautotunnel/data · high confidence
Database schema restructuring for settings and tunnel configuration
The application's local database has been restructured from a single flat settings table into four distinct tables: \general\_settings\, \auto\_tunnel\_settings\, \monitoring\_settings\, and \dns\_settings\, alongside a new \tunnel\_config\ table for storing individual tunnel definitions. This migration (version 23 to 24) preserves existing user preferences by mapping legacy fields to their new counterparts, ensuring that settings such as shortcut enablement, boot restoration, multi-tunnel support, and auto-tunnel triggers remain intact after the upgrade.
app/src/main/java/com/zaneschepke/wireguardautotunnel/data/migrations · high confidence
Establish centralized build configuration and automation utilities
The buildSrc module now centralizes core build constants, including the application version (5.7.5), SDK targets (min 26, target 37), and build type definitions (release, nightly). It introduces Kotlin extensions to automate version code generation for nightly builds using CI run numbers or commit counts, dynamically detect supported languages from resource folders, and retrieve the current Git commit hash. Additionally, it provides utilities for reading local properties and defining allowed open-source licenses.
buildSrc · high confidence
Introduces domain enums for tunnel configuration, DNS policies, and connection monitoring
This change adds a comprehensive set of domain enums in the app's \domain/enums\ package to support new tunnel and DNS configuration capabilities. Key additions include \TunnelDnsMode\ (Off, Encrypted, Split, AllLocal) and \TunnelDnsProtocol\ (DoH, DoT, Plain) to allow users to configure encrypted or split DNS for tunnels, and \ForeignDnsPolicy\ (Redirect, Block, Allow) to control how non-tunnel DNS traffic is handled. It also introduces \BootstrapDnsProtocol\ for initial connection resolution, \HandshakeStatus\ constants for monitoring tunnel health, \SeamlessRecoveryBounceDelay\ options for tuning connection recovery, and \WifiDetectionMethod\ (Default, Legacy, Root, Shizuku) to refine Wi-Fi based trigger detection. These enums provide the structured configuration options that underpin the redesigned tunnel bootstrapping and DNS handling features.
app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/enums · high confidence
Introduces structured domain events for tunnel actions, backend errors, and kill switch states
The application now uses a set of sealed classes and interfaces in the domain events package to standardize how internal state changes are communicated. TunnelActionEvent defines explicit Started and Stopped events for specific tunnels, BackendCoreException provides typed error handling for issues like DNS failures, unauthorized access, or unsupported kernel features, BackendMessage carries success notifications such as DynamicDnsSuccess, and KillSwitchEvent manages start, stop, and no-op states for the kill switch. This refactoring replaces ad-hoc error or status propagation with a consistent, type-safe event model.
app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/events · high confidence
Migrate navigation to Navigation3 and remove legacy UI scaffolding
The app's navigation system has been upgraded from the legacy Accompanist AnimatedNavHost to the new Navigation3 runtime. This change introduces a new \Locals.kt\ file to manage composition locals for the navigation controller and Android TV detection, replacing the previous \MainActivity.kt\ which handled navigation state, permission requests, and screen transitions. Consequently, the old \Routes.kt\ (defining bottom navigation items) and \ViewState.kt\ (managing snackbar and loading states) have been removed, as these responsibilities are now handled by the new navigation architecture and associated ViewModels.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui · high confidence
Migrate to Navigation3 with redesigned tab and route structure
The app's navigation system has been upgraded to use the Navigation3 library, introducing a new \NavController\ implementation and a comprehensive \Route\ sealed class that defines all app screens (such as Tunnels, AutoTunnel, Settings, and Support) along with their security requirements. This change restructures how navigation states are managed, including specific logic for handling back stacks and disclosure screens, and establishes a new tab-based interface with distinct active and inactive icons for the primary navigation sections.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation · high confidence
Migration from ObjectBox to Room database
The app has switched its local persistence layer from ObjectBox to Android Room. As part of this migration, the ObjectBox model definition files (default.json and default.json.bak) have been removed, indicating that the previous ObjectBox schema is no longer used.
app/objectbox-models · high confidence
Modernized clipboard access and improved file picker reliability on Android TV
The app now uses the modern Compose Clipboard API for copy and paste operations, replacing the deprecated Android clipboard manager. Additionally, file import and export launchers have been updated to detect and handle Android TV stub file explorers, preventing silent failures when no real file picker is available.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/functions · high confidence
New UI state architecture for tunnel groups, AmneziaWG 3.1, and refined connection states
The app's UI state management has been restructured into a comprehensive set of dedicated state classes (e.g., ConfigUiState, TunnelUiState, GlobalAppUiState) to support new features and improved reliability. Users can now organize connections using tunnel groups, with the list view handling grouping, reordering, and scope-aware sorting. The interface now supports AmneziaWG 3.1 properties, including new obfuscation fields like randomTrailers and disableCookies, as well as presets for mimicking QUIC, DNS, and SIP traffic. Connection status display has been refined to show distinct states such as ResolvingDns, EstablishingConnection, and HandshakeFailure, providing clearer feedback during bootstrapping and operation.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/state · high confidence
New common UI button components and refactored clickable icon button
The app introduces a new set of Compose UI components in the \ui.common.button\ package to standardize interface elements. This includes \SurfaceRow\ for list items with support for Android TV navigation (long-press handling, focus management), \IconSurfaceButton\ for selectable card-style actions, \PreferenceTrailing\ for consistent chevron dividers in settings, and themed switches (\ThemedSwitch\, \SwitchWithDivider\). Additionally, the existing \ClickableIconButton\ has been moved to this new package and refactored to use \TextButton\ with updated styling and content descriptions.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/button · high confidence
New common dialog components for permissions, restarts, and VPN status
The app introduces a set of reusable UI dialogs in the common dialog package to improve user guidance and configuration management. A generic InfoDialog component now serves as the base for specific use cases, including a LocalNetworkPermissionDialog that explains the impact of missing local network permissions on tunnels, auto-tunnel, and proxy features, and a VpnDeniedDialog that alerts users when Always-On VPN is disabled and provides a direct link to VPN settings. Additionally, a RestartToApplyChanges dialog allows users to choose between saving changes immediately or saving and restarting the app to apply them, ensuring configuration updates are handled consistently.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/dialog · high confidence
New domain models for settings, tunnel configuration, and app state
The app introduces a comprehensive set of new domain models in the \domain.model\ package to structure configuration and state data. \GeneralSettings\ now holds user preferences including theme, locale, kill switch metered behavior, and seamless recovery options. \AutoTunnelSettings\ manages network-triggered tunneling rules, supporting WiFi detection methods, BSSID filtering, and captive portal handling. \DnsSettings\ provides granular control over DNS modes, split DNS suffixes, and foreign DNS policies. \TunnelConfig\ represents individual tunnel definitions with support for groups, metered status, and IPv6 preferences, while \TunnelGroup\ allows organizing tunnels. \LockdownSettings\ and \ProxySettings\ handle security bypasses and proxy configurations respectively. Additionally, \AppState\ tracks UI state flags like donation snackbar visibility, and \UpdateDownloadState\ manages the lifecycle of in-app update downloads.
app/src/main/java/com/zaneschepke/wireguardautotunnel/domain/model · high confidence
New notification service implementation with live tunnel updates and customization options
The app introduces a new notification architecture in the \notification\ package, replacing the previous implementation with \AndroidNotificationService\ and \AndroidTunnelNotificationService\. This change enables live updates for tunnel status notifications, allowing users to see real-time data such as transfer statistics, connection origin (manual vs. auto), and recovery attempts. The new system supports customizable notification channels, including distinct handling for VPN and proxy tunnels, and introduces features like failure tinting for handshake errors and chronometer-based uptime tracking. It also integrates seamless recovery events and update notifications (available, ready to install, failed) directly into the notification stream, improving user awareness of app and tunnel states.
app/src/main/java/com/zaneschepke/wireguardautotunnel/notification · high confidence
New utility extension library for configuration, UI, and system interactions
This change introduces a new set of Kotlin extension functions in the \util/extensions\ package to centralize common logic. For configuration management, \RepositoryExtensions\ now handles the automatic renaming of duplicate tunnel imports to prevent overwrites, while \TunnelExtensions\ manages the mapping of DNS settings (including split, encrypted, and local modes) to the backend configuration and detects Amnezia/WG compatibility parameters. On the UI side, \UiExtensions\ provides localized duration formatting for tunnel uptime, generates icons for tunnel modes (VPN, Proxy, Lockdown) and DNS settings, and formats proxy status text. System-level helpers in \ContextExtensions\ standardize launching device settings (notifications, VPN, location), handling Safe Access Framework (SAF) file exports with Android TV fallbacks, and managing APK installations. Additional utilities in \StringExtensions\ support wildcard matching for network exclusions and QR code size validation, while \FlowExtensions\ adds a debounce operator to stabilize state flapping.
app/src/main/java/com/zaneschepke/wireguardautotunnel/util/extensions · high confidence
Project rebrand to WG Tunnel and migration to modular architecture
The application has been rebranded from 'WG Auto Tunnel' to 'WG Tunnel' and now supports both WireGuard and AmneziaWG protocols. The architecture has shifted to a modular design where the app consumes published 'core' artifacts from Maven Central by default, while still allowing local development against a local core checkout. The user interface has been updated with new screenshots and a redesigned feature list highlighting capabilities like deferred endpoint bootstrapping, handshake monitoring, split tunneling, and lockdown mode. Additionally, the project has migrated its translation workflow from Crowdin to Weblate, updated its license to 2023-2025, and removed FireTV support.
(repo-wide) · high confidence
Redesigned UI theme with new color palette, typography, and multiple theme modes
The app's visual appearance has been updated with a new color palette (replacing the previous purple/pink scheme with aqua, gray, and dark tones) and the Inter font family for all text styles. Users now have access to six distinct theme modes: Automatic, Light, Dark, Darker, AMOLED, and Dynamic (Android 12+). The AMOLED mode uses pure black backgrounds and Electric Teal accents, while the Darker mode deepens the standard dark theme. Additionally, ripple animation intensities have been adjusted for Android TV to improve hover and focus visibility, and the previous transparent system bar implementation has been removed in favor of standard window insets handling.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/theme · high confidence
Redesigned navigation UI with dynamic app bars and animated bottom tabs
The app's navigation interface has been updated to use a new bottom navigation bar featuring animated icons and a status badge for the AutoTunnel tab, alongside dynamic top app bars that adapt their content (such as back buttons and action icons) based on the current screen. This change also introduces specific support for Android TV, including a dedicated back button component and ripple configuration adjustments to improve focus handling and visual feedback on remote-controlled devices.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/navigation/components · high confidence
Redesigned split tunnel configuration UI with app selection and mode switching
The split tunnel screen now features a new UI for configuring split tunneling, allowing users to select a mode (such as all apps or specific apps) via segmented buttons and toggle individual installed applications. The app list includes a search filter, sorts selected apps to the top, and displays app icons and package names. Additionally, a modal dialog enables copying split tunnel configurations from existing tunnels.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/splittunnel/components · high confidence
Redesigned tunnel configuration editor with granular Amnezia and interface controls
The tunnel settings editor has been rebuilt using new Compose UI components to provide a more structured and granular configuration experience. Users can now edit interface details (private/public keys, addresses, listen port) and peer details (public key, pre-shared key, endpoint, allowed IPs) in dedicated sections. A new quick-actions menu allows toggling the visibility of advanced Amnezia WIREGUARD properties (junk packet counts, magic headers) and legacy compatibility modes, as well as applying traffic mimicry profiles (QUIC, DNS, SIP). The editor also exposes explicit fields for pre/post up/down scripts and includes a dedicated button for adding new peers.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/settings/config/edit/components · high confidence
Removal of legacy ObjectBox data models
The application has removed the \Settings\ and \TunnelConfig\ data classes from the tunnel model package. These classes, which previously handled local persistence using ObjectBox annotations, are no longer present in the codebase, reflecting the migration from ObjectBox to Room as indicated by the commit history.
app/src/main/java/com/zaneschepke/wireguardautotunnel/service/tunnel/model · high confidence
Removal of legacy bottom navigation bar components
The app has removed the legacy bottom navigation implementation, specifically deleting the \BottomNavBar\ composable and the \BottomNavItem\ data class. This change eliminates the previous UI component used for screen switching via a bottom bar, indicating a shift in the navigation architecture or UI structure.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common/navigation · high confidence
Removal of legacy main screen and view model
The previous main screen implementation (MainScreen.kt) and its associated view model (MainViewModel.kt) have been removed from the application. This change eliminates the legacy UI component that displayed the tunnel list, handled tunnel start/stop actions, and managed file imports via the old ViewModel architecture, indicating a migration to a new screen structure or navigation pattern elsewhere in the app.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/main · high confidence
Remove Firebase dependency and update build configuration
The app no longer includes Firebase services, as evidenced by the deletion of the google-services.json configuration file. To support this change and streamline the build process, the ProGuard rules file has been significantly simplified to remove legacy comments and retain only a single warning suppression rule. Additionally, a template for signing properties has been added to facilitate secure build configuration, and the .gitignore file has been updated to exclude generated license assets.
app · high confidence
Settings UI restructured into dedicated sub-screens
The Settings screen has been refactored to organize configuration options into distinct, dedicated sub-screens: Tunnel Globals (for split tunneling and global config), Android Integrations (for Always-On VPN, boot restart, shortcuts, and remote control), Monitoring (for statistics and refresh rates), and Security (for screen recording protection and app lock). This change replaces the previous monolithic settings layout and the old SettingsViewModel with a new modular structure using Koin dependency injection and Orbit state management, improving navigation and feature isolation.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/settings · high confidence
Support screen redesigned with in-app updates and expanded resources
The Support screen has been completely rewritten to use a modern Compose-based layout with scrollable content, replacing the previous static view. Users now have access to a comprehensive set of resources including links to documentation, the website, GitHub issues, Telegram, Matrix, and translation efforts. A key behavioral change is the integration of an in-app update mechanism for the standalone flavor, which includes a download progress indicator and permission handling dialogs. The screen also adds direct actions for leaving Play Store reviews, contacting support via email, and copying crypto donation addresses to the clipboard.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support · high confidence
UI component refactoring: new expanding list item and removal of legacy components
The common UI module has been updated to support more flexible list item interactions. A new ExpandingRowListItem composable has been added, allowing list items to expand and reveal additional content while providing consistent ripple effects and selection highlighting. To support this new pattern, the previous static RowListItem and the PermissionRequestFailedScreen components have been removed from the codebase.
app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/common · high confidence
Test coverage
Added database migration tests and cleaned up test imports
Added an Android instrumented test (MigrationTest) to verify the database migration from schema version 6 to 7, ensuring data integrity during upgrades. Additionally, cleaned up unused imports and fixed missing newlines in existing unit and instrumented test files (ExampleInstrumentedTest and ExampleUnitTest) to improve code quality and consistency.
app/src/androidTest · high confidence
Dependencies
Migrate to Gradle Version Catalog and modernize build infrastructure
The project has been refactored to use the Gradle Version Catalog (gradle/libs.versions.toml) for centralized dependency management, replacing the previous hardcoded version strings and buildscript dependencies. This change introduces a comprehensive set of updated libraries, including Kotlin 2.4.20, Android Gradle Plugin 9.4.1, KSP 2.3.11, Compose BOM 2026.09.00, Room 2.8.5, Koin 4.2.2, and Ktor 3.6.0. The build system now utilizes Kotlin DSL for all configuration, integrates KTFMT for code formatting, and adds license compliance checks via the Licensee plugin. Additionally, the project structure has been expanded to include new submodules for logging (logcatter), network monitoring (networkmonitor), and ping functionality (pinger), while removing legacy dependencies like ObjectBox and Firebase Crashlytics.
(dependencies) · high confidence
Upgrade Gradle wrapper to version 9.8.0
The project's Gradle wrapper has been upgraded from version 8.1 to 9.8.0. This update includes a new SHA-256 checksum for distribution validation and introduces new configuration properties for network timeouts, retries, and distribution URL validation to improve build reliability.
gradle/wrapper · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 60 → 58 (-1.2)
- Rubric changed (rubric-2026.09.8 → rubric-2026.09.16) — scores are not directly comparable.
Lenses
- Code Health 90 → 89 (-0.8)
- Architecture 97 → 87 (-9.8)
- Maturity 59 → 53 (-5.5)
- Readiness 57 → 57 (+0.0)
- Security 65 → 71 (+5.8)
- Domain Modelling 56 → 55 (-0.7)
- Performance 100 (new)
Resolved (9)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- MethodTooLong: SortScreenKt.SortScreen (app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/sort/SortScreen.kt)
- MethodTooLong: WifiSettingsScreenKt.WifiSettingsScreen (app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/autotunnel/wifi/WifiSettingsScreen.kt)
- Repeated repair: app/src/main/java/com/zaneschepke/wireguardautotunnel/core/event/TunnelEventDispatcher.kt (app/src/main/java/com/zaneschepke/wireguardautotunnel/core/event/TunnelEventDispatcher.kt)
- Repeated repair: app/src/main/java/com/zaneschepke/wireguardautotunnel/service/autotunnel/AutoTunnelEngine.kt (app/src/main/java/com/zaneschepke/wireguardautotunnel/service/autotunnel/AutoTunnelEngine.kt)
- Repeated repair: app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/ConfigEditViewModel.kt (app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/ConfigEditViewModel.kt)
- Repeated repair: app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/SplitTunnelViewModel.kt (app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/SplitTunnelViewModel.kt)
- SortScreenKt.SortScreen (cyclomatic 17) (app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/sort/SortScreen.kt)
New (23)
- AutoTunnelScreenKt.AutoTunnelScreen (cyclomatic 17) (app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/autotunnel/AutoTunnelScreen.kt)
- Change coupling: Constants.kt ↔ FileUtils.kt (app/src/main/java/com/zaneschepke/wireguardautotunnel/util/Constants.kt)
- ClassTooLong: SharedAppViewModel (app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/SharedAppViewModel.kt)
- Duplicated block (16 lines × 2) (app/src/main/java/com/zaneschepke/wireguardautotunnel/data/mapper/TunnelConfigMapper.kt)
- FileTooLong: viewmodel/SharedAppViewModel.kt (app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/SharedAppViewModel.kt)
- Hotspot: app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/autotunnel/AutoTunnelScreen.kt (app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/autotunnel/AutoTunnelScreen.kt)
- Hotspot: app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt (app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt)
- Hotspot: app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/TunnelList.kt (app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/TunnelList.kt)
- Low cohesion: SharedAppViewModel (LCOM4 5) (app/src/main/java/com/zaneschepke/wireguardautotunnel/viewmodel/SharedAppViewModel.kt)
- MethodTooLong: TunnelListKt.ListRow (app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/TunnelList.kt)
- MethodTooLong: TunnelListKt.TunnelList (app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/TunnelList.kt)
- MethodTooLong: TunnelsScreenKt.TunnelsScreen (app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/TunnelsScreen.kt)
- No ADRs found
- Off the main sequence: :logcatter
- Off the main sequence: :networkmonitor
- Split app
- SupportScreenKt.SupportScreen (cognitive 21) (app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt)
- SupportScreenKt.SupportScreen (cyclomatic 23) (app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/support/SupportScreen.kt)
- TunnelListKt.ListRow (cognitive 40) (app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/TunnelList.kt)
- TunnelListKt.ListRow (cyclomatic 25) (app/src/main/java/com/zaneschepke/wireguardautotunnel/ui/screens/tunnels/components/TunnelList.kt)
- …and 3 more
Changes since last survey
- 11 commits — 5 feature/other, 6 fixes
By area
- app/src — 5 commits
- buildSrc/src — 3 commits
- gradle/libs.versions.toml — 3 commits
Notable commits
- fix: fix: auto tunnel partial tunnel teardown and sync
- fix: fix: auto tunnel recovery on system kill, network identity stabilization
- fix: fix: bump core for amnezia padding fix and tunnel dns network handle race
- fix: fix: bump core to fix 32-bit Android tunnel failures (especially Android TV)
- fix: fix: in-app updater to use download manager when available
- fix: fix: underlay detection on samsung, stop on no network, and DoT tunnel DNS
- change: chore: release 5.7.3
- change: chore: release 5.7.4
- change: chore: release 5.7.5
- change: feat: tunnel groups
- change: refactor: bump core socket opts and tunnel healthy ack race
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
wgtunnel/android was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 28 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 3dd7e9cfa5f3fa6013a297963866f86f9e26fbf9 — the exact code this score is about.
- Scored under rubric-2026.09.16 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-2d9048c36d26.