blokadaorg/blokada
66.7
Adequate · 23 September 2026
62.1k
lines of production code
Dart
with Swift, Kotlin, JavaScript
4
measurements over time
What this system is
This system is a cross-platform mobile application for network privacy and parental control, built with Flutter and native Android/iOS components. It manages VPN tunneling via WireGuard, enforces content filtering through customizable blocklists and family safety shields, and supports multiple product variants including a standard v6 version and a dedicated family management flavor. The platform handles user authentication, subscription management via Adapty, and device synchronization across mobile and macOS environments.
How it got here
2023 — Flutter integration and localization expansion
59 changes.
The project restructured its build systems and introduced a shared common module to enable Flutter-based UI components across Android and iOS platforms. This period also focused on extensive internationalization, adding support for numerous languages, while establishing native binding layers to bridge Flutter with platform-specific services.
2024–2026 — Family variant and v6 architecture
84 changes.
The project introduced a distinct 'Family' app flavor with dedicated UI, device management, and scheduling features, while simultaneously restructuring the main 'v6' variant with adaptive layouts and modular domain logic. This period focused on establishing a robust common core infrastructure, including new Pigeon interfaces, structured logging, and a comprehensive UI component library, to support both variants. Extensive unit and automation testing was added to validate the new architecture, payment integrations, and cross-platform stability.
Features
Add Portuguese (Brazil) localization for the iOS app
The iOS app now supports Portuguese (Brazil) as a user interface language. This change adds the \pt.lproj\ localization bundle, including new translation files for blocklist tags (\PackTags.strings\), blocklist descriptions and shield names (\Packs.strings\), and core UI strings (\Ui.strings\). Users with their device language set to Portuguese will now see the app interface, error messages, and blocklist options in their language.
ios/App/Assets/pt.lproj · high confidence
Added Arabic and Hindi localization for blocklist packs and UI
The app now supports Arabic and Hindi languages. This update adds new localization files (PackTags.strings, Packs.strings, Ui.strings) for both languages, providing translations for blocklist search tags (such as 'adblocking', 'privacy', 'malware'), descriptions of available blocklist packs and family shields (like 'Ads', 'Malware', 'Adult Content'), and core user interface elements including error messages, navigation tabs, and action buttons.
ios/App/Assets/ar.lproj · high confidence
Added Bulgarian translations for blocklist tags, packs, and UI
The app now supports Bulgarian language for blocklist search tags (such as 'recommended', 'adblocking', and 'privacy'), descriptions and names for various blocklist packs and family shields (including Ads, Malware, Adult Content, and Gaming), and core user interface elements like error messages, action buttons, and tab labels.
ios/App/Assets/bg.lproj · high confidence
Added Finnish and Hungarian localization for blocklist packs and UI
The iOS app now includes Finnish (fi) and Hungarian (hu) translations for the user interface, blocklist pack descriptions, and shield tags. Users can now see localized names and descriptions for ad-blocking lists (such as Energized, hBlock, and DuckDuckGo Tracker Radar) and family safety shields (including Ads, Malware, Adult Content, Dating, Gambling, Piracy, Video streaming, Streaming, Social media, Chat apps, Gaming, Games, Online shopping, Other apps, and Safe search) in their respective languages.
(repo-wide) · high confidence
Added Indonesian (Bahasa Indonesia) localization for blocklist tags, descriptions, and UI
The app now supports Indonesian (id.lproj) for blocklist-related content, including search tags (e.g., 'adblocking', 'tracking'), detailed descriptions for various blocklist packs (e.g., 'Energized System', 'DuckDuckGo Tracker Radar'), and Family Shield categories (e.g., 'Ads', 'Malware', 'Adult Content'). This update also includes translations for core user interface elements, error messages, and notification text, ensuring Indonesian-speaking users can fully understand and configure blocking features.
ios/App/Assets/id.lproj · high confidence
Added Polish and Traditional Chinese localization for blocklist packs and UI
The app now includes Polish (pl) and Traditional Chinese (zh-Hant) language support for the blocklist selection interface and core user interface elements. This update adds new string files (PackTags.strings, Packs.strings, and Ui.strings) for both languages, providing translations for blocklist category tags (such as 'adblocking', 'privacy', 'malware'), detailed descriptions of available blocklist packs and 'shields' (like Ads, Malware, Adult Content), and standard UI text for error messages, actions, and navigation tabs.
ios/App/Assets/pl.lproj · high confidence
Added Russian localization for blocklist tags, descriptions, and UI strings
The app now includes Russian translations for the user interface, blocklist tags, and pack descriptions. This adds support for filtering blocklists by tags such as 'adblocking', 'privacy', and 'malware', and provides Russian descriptions for various blocklist packs and family shields (e.g., 'Ads', 'Malware', 'Adult Content'). It also translates core UI elements, error messages, and navigation tabs.
ios/App/Assets/ru.lproj · high confidence
Added macOS-compatible file sharing and visual touch feedback utilities
The debug build now includes a ShareSheet component that ensures files are correctly prepared for sharing on macOS by copying them to the temporary directory, and integrates the ShowTime library to display visual indicators for taps, swipes, and force touches during presentations or demos.
ios/App/Debug · high confidence
Added mock UI scaffolding and background widgets for the Family variant
This change introduces new mock components in the \common/lib/mock\ directory to support the Family app variant's UI development. It adds a \CoolBackground\ widget with custom gradient painting logic, a \Coolbg\ stateful widget that layers the Blokada logo over the background, and a \MockScaffoldingWidget\ that serves as a navigation hub for previewing various UI elements like filter components, profile headers, and screens. Additionally, it includes foundational \ideas\ module files (\context.dart\, \ops.dart\) defining generic operation mixins and context-aware read/write classes, likely intended for future data-binding or state-management implementations within the mock environment.
common/lib/mock · high confidence
Android app architecture refactored for Family flavor and v6 engine
The Android application code has been restructured to support the new 'family' flavor and the v6 engine architecture. This includes a new EngineService that manages the WireGuard tunnel in 'Plus mode' (cloud filtering), replacing previous logic. A dedicated family module has been added, featuring a FamilyBinding for dependency injection, a Flavor service to identify the build variant, and a ScanQrFragment for family account linking. The app's data layer has been updated to use Kotlinx Serialization for JSON handling, and the notification system now supports family-specific alerts and weekly reports. Additionally, the app now requests the QUERY\_ALL\_PACKAGES permission to support the VPN bypass feature on Android 11+.
app · high confidence
Automated iOS device log and crash report retrieval
The automation suite now includes a new capability to fetch and filter recent application logs and crash reports from connected iOS devices. This change introduces a new \automation/device/lib/log.mjs\ module and a \log.mjs\ CLI entry point that support retrieving logs for specific bundle IDs (Blokada 6 and Blokada Family) with time-window filtering (last hour or today) and line limits. It also adds logic to locate and save the newest crash reports. The implementation relies on a new \automation/shared/lib/devices.mjs\ module to discover and resolve target iOS devices via \xcrun xcdevice\ and \xctrace\, ensuring the automation can interact with the correct hardware. Tests have been added to verify log filtering, artifact selection, and device resolution logic.
automation/device · high confidence
Configure Claude Code with custom marketplace, plugins, and build permissions
The project now includes a \.claude/settings.json\ file that integrates the 'blokada-workflows' marketplace (auto-updating from GitHub) and enables the 'blokada-workflows' plugin. It also sets a 900-second default timeout for Bash commands and grants explicit permissions for various Flutter, FVM, Make, and iOS development tools (including \xcrun devicectl\ and \xcodebuild\). Additionally, a \.claude/skills\ symlink points to \../.agents/skills\ to expose agent skills.
.claude · high confidence
Dutch localization added for blocklist packs, shields, and UI
The app now supports Dutch (nl) for blocklist pack names and descriptions, shield categories (such as Ads, Malware, Adult Content, and Gaming), and core interface elements including error messages, navigation tabs, and action buttons.
ios/App/Assets/nl.lproj · high confidence
German localization for blocklist packs, shields, and UI
Added German translations for the blocklist search tags (PackTags.strings), blocklist and shield descriptions (Packs.strings), and core application interface strings (Ui.strings). This enables German-speaking users to discover, understand, and interact with the app's filtering options and main screens in their native language.
ios/App/Assets/de.lproj · high confidence
Initial English localization for blocklists, shields, and core UI
The app now includes English strings for the blocklist selection interface, including descriptions for various ad-blocking and privacy lists, as well as the new 'Family' shield categories (Ads, Malware, Adult Content, Dating, Gambling, Piracy, Video streaming, Streaming, Social media, Chat apps, Gaming, Games, Online shopping, Other apps, and Safe search). Additionally, core UI elements such as error messages, navigation tabs, home screen status indicators, and universal actions are now localized.
ios/App/Assets/en.lproj · high confidence
Initial iOS app interface and project structure
The iOS application now includes its primary user interface and project configuration. A new Main.storyboard defines the core layout, featuring a gateway selection picker, a switch to toggle the VPN connection, an input field for account identification, and status labels for both the account and VPN state. A basic LaunchScreen.storyboard has been added to handle the app's startup display, and the Xcode workspace file has been initialized to reference the project.
ios/App/Assets/Base.lproj, ios/App/Base.lproj, ios/tunnel.xcodeproj · high confidence
Initial iOS release automation with fastlane
Added a new fastlane configuration for iOS, introducing lanes to build the main and Family app variants and a robust promotion workflow. The release process now validates that builds are processed on TestFlight before attempting submission and actively manages App Store Connect review states by cancelling in-progress reviews when necessary, ensuring that only one version is ever in review at a time. This setup includes specific provisioning profiles for network and web extensions and provides clear error messages for blocked release states.
ios/fastlane · high confidence
Introduce BlockaWeb Safari Extension with native messaging and freemium support
The iOS app now includes a new Safari Web Extension (BlockaWebExtension) that provides ad-blocking capabilities directly in Safari. The extension communicates with the main app via native messaging, exchanging subscription status, active state, and freemium trial details (including YouTube-specific trial expiration). It uses shared app group containers to read status data and supports content blocking rules generated from domain lists (e.g., oisd). The extension displays different UI states (Inactive, Active, Expired, Freemium Trial) based on the received status and handles timestamp parsing for Go API date formats.
ios/BlockaWebExtension · high confidence
Introduce Family app flavor with dedicated UI and service configuration
The iOS app now supports a distinct 'Family' build flavor, providing a separate user interface and service layer. This change introduces new SwiftUI views (BlokadaView, ContentView, SplashView) and view models (HomeViewModel, ContentViewModel, AccountViewModel) specific to the Family variant. It also adds a Flutter channel for IANA timezone resolution and configures platform-specific services, such as using a macOS-compatible private DNS service when running on Apple Silicon Macs.
ios/Family · high confidence
Introduce NotFamily iOS flavor with SwiftUI UI and WireGuard VPN service
This change adds a new iOS application variant (flavor) named 'NotFamily' to the codebase. It introduces a complete SwiftUI-based user interface, including a main content view, splash screen, and a location selection list for managing VPN gateways. It also implements the underlying network service layer using WireGuard (via \WgService\ and \TunnelsManager\) to handle VPN configuration, activation, and status, along with bindings to connect these native components to the Flutter/Dart application layer.
ios/NotFamily · high confidence
Introduce dependency validation automation for risky dependency bumps
Added a new \dep-validate\ automation tool that scans for open Dependabot pull requests and flags those requiring human or agent review. The system identifies high-risk updates (such as major version bumps or changes to packages like Adapty, Firebase, WireGuard, and Gradle) and generates validation reports that include on-device smoke test results for specific business surfaces like payments and protection. It also handles advisory entries for ecosystems not covered by Dependabot, such as iOS Swift Package Manager, ensuring that risky dependency changes are validated before merging.
automation/dep-validate · high confidence
Introduce in-app support chat with link handling and Android keyboard fixes
This change adds a new support chat feature to the application. The domain layer implements session management, message history, and API communication, including a purchase timeout event for family accounts. The UI layer introduces a custom chat composer that resolves an Android-specific issue where the keyboard would obscure the chat or drop the send action by forcing a single-line text input with a send action key. Additionally, sent messages now render clickable, visible links using a custom widget that ensures link colors remain readable against the sent bubble background.
common/lib/src/features/support · high confidence
Introduce local LLM-driven AI explorer for automated iOS UI testing
Adds a new AI-driven automation workflow that uses a local language model endpoint to autonomously explore the Blokada iOS app, detect regressions like blank screens or broken navigation, and generate detailed Markdown reports. The scripts manage the Appium runtime, enforce safety guardrails to prevent destructive actions, and provide a JSONL interface for programmatic control, enabling deeper, model-guided UI testing beyond static smoke tests.
automation/appium/wdio/scripts · high confidence
Introduces modular domain logic and UI components for the new app variant
This change adds the foundational domain layer and UI widgets for the new app variant (v6/family). It introduces a new Profile module for managing user profiles and filter configurations, a CustomList module for handling domain allow/block lists with wildcard support, and a Journal module for fetching and filtering activity logs. Additionally, it adds UI components including a SmartHeader for the home screen, an ActivityRuleDialog for domain-specific rule selection, a WeeklyRefreshSheet for filter updates, and a QR scan module for macOS.
(repo-wide) · high confidence
Japanese localization for blocklist tags, descriptions, and UI
Added Japanese translations for blocklist search tags (e.g., 'recommended', 'adblocking'), detailed descriptions for available blocklist packs and 'Family' shields (e.g., 'Ads', 'Malware', 'Adult Content'), and core UI strings including error messages, action labels, and tab names.
ios/App/Assets/ja.lproj · high confidence
New Account settings view model with biometric authentication
The Settings area now includes a dedicated AccountViewModel that manages account-related state and handles biometric authentication for unlocking account details. This view model uses LocalAuthentication to verify the user's identity via biometrics before allowing access, providing a more secure and seamless user experience when managing account settings.
ios/App/UI/Settings · high confidence
New Adapty payment UI fragments for mobile and tablet
Added AdaptyPaymentFragment and AdaptyPaymentTabletDialogFragment to handle the Adapty paywall display. The mobile fragment presents the paywall as a non-draggable bottom sheet with a fade-in animation, while the tablet fragment displays it as a centered dialog with a fixed width to prevent stretching on wide screens. Both fragments include a loading spinner and delay the paywall view attachment to ensure smooth transitions.
android/app/src/six/kotlin/ui · high confidence
New Android binding layer for Flutter integration
The Android app now includes a new set of Kotlin binding classes (BackNav, CommandBinding, CommonBinding, CoreBinding, StageBinding) that bridge native Android services to the Flutter engine. This layer handles core platform interactions including command execution with queuing, environment info retrieval, HTTP requests, local notification management, log file persistence with size trimming, and UI stage routing/modals, enabling the Flutter UI to control native Android behaviors.
android/app/src/main/java/binding · high confidence
New Appium automation flows for account, navigation, and system interaction
This change introduces a suite of new automation flow modules in the Appium test suite to support iOS smoke testing. The \account.ts\ flow enables switching between active and inactive accounts via an in-app support chat command bus, allowing tests to run against specific account states without manual intervention. The \alerts.ts\ flow adds robust handling for system-level interruptions, automatically dismissing notification permission prompts and failing fast when blocking device alerts (such as 2FA or storage warnings) appear, which prevents silent test hangs. Navigation is handled by \nav.ts\ and \home.ts\, providing reliable screen-waiting and power-toggle interaction logic that works around unreliable bottom-tab identifiers. Additional flows in \app.ts\, \modals.ts\, \onboarding.ts\, and \settings.ts\ standardize app lifecycle management, rate-prompt dismissal, DNS onboarding handling, and deep navigation into iOS system settings for VPN profile installation.
automation/appium/wdio/src/flows · high confidence
New Privacy Pulse stats section with radial charts and weekly report integration
The home screen now includes a new Privacy Pulse section that visualizes allowed versus blocked traffic using interactive radial bar charts (green for allowed, red for blocked) and integrates weekly report data. Users can view daily and weekly stats, see delta changes, and access weekly reports directly from the stats view, with the card closing after interaction.
_common/lib/src/app\variants/v6/widget/home/stats · high confidence
New QR code scanning and family account attachment UI
The iOS app now includes a new AccountChangeView that allows users to attach a family account by scanning a QR code. This view uses the CodeScanner library to capture QR codes, processes the scanned token, and executes a URL command to complete the attachment. The implementation includes a dedicated scanner overlay (AccountChangeScanView) and handles scanning errors by prompting the user to enable camera permissions in app settings. Additionally, a new ContentViewModel manages the state for sharing content (logs, URLs, text) and handling modal stages, while MainView serves as the primary entry point wrapping the Flutter home view.
ios/App/UI/Main · high confidence
New SwiftUI UI components for buttons and loading states
Added three new SwiftUI view components to the iOS app: ButtonView, which renders a styled button with accent or active colors based on enabled and plus states; LoadingButtonView, a button that displays a toggle and a ProgressView spinner during a 1.8-second loading action; and SpinnerView, a continuously rotating circular indicator. These components provide reusable UI elements for interactive controls and loading feedback.
ios/App/UI/Component · high confidence
New UI assets and animations for the redesigned interface
The Android app now includes a new set of visual resources to support the updated user interface. This adds custom fragment transition animations (open and close) for smoother screen navigation, along with a collection of new vector drawables. These include country flag icons (such as Australia, Canada, Germany, Spain, and the UK) for location-based features, specific UI icons like a playlist add and QR code scanner, and themed background shapes for the home screen and payment screens (distinguishing between Cloud, Family, and Plus tiers).
android/app/src/main/res · high confidence
New Vpn binding layer with NetxServiceIn protocol and mock implementation
The iOS app introduces a new binding layer in the Vpn module, defining the NetxServiceIn protocol to manage VPN lifecycle events (start, stop, pause, config) and expose status via Combine publishers. This includes a new NetworkStatus struct and VpnStatus enum to represent connection states, along with a NetxServiceMock implementation for testing purposes.
ios/App/Binding/Vpn · high confidence
New build, signing, and release-validation tooling
The scripts directory now includes dedicated tooling to manage build numbers, verify iOS code signatures, and validate release states. \scripts/build-number.sh\ allocates and resolves a forever-incrementing build number stored in git tags, ensuring version names are baked at build time. \scripts/sign-ios-frameworks.sh\ signs third-party xcframework bundles with a secure timestamp to prevent ITMS-91065 rejections, while \scripts/verify-ios-ipa-signatures.sh\ checks both origin signatures and embedded framework seals. \scripts/check-adapty-fallback-version.mjs\ ensures Adapty fallback paywall JSONs match the SDK's expected format version. \scripts/verify-play-version-code.rb\ confirms that Android version codes have been uploaded to the Play Store before promotion, and \scripts/test-release-state.rb\ tests the logic for gating App Store promotions based on version states. Additional scripts include \scripts/convert-domains-to-rules.py\ for generating Safari Web Extension rules, \scripts/en\_check\_elf\_alignment.sh\ for Android 16KB page alignment checks, and \scripts/sync-generated-files.sh\ for running code generation tools.
scripts · high confidence
New family-specific main screen and filter section widgets
The family app variant now includes dedicated UI components for its main navigation and profile filtering. A new \FamilyMainScreen\ widget provides the root scaffold, integrating the animated background, the common top bar, and the bottom/overlay sheet managers. Additionally, a new \FamilyFiltersSection\ widget renders the profile filter list, featuring a configurable header (avatar and profile name) and specific color theming for family versus legacy V6 filter cards.
_common/lib/src/app\variants/family/widget · high confidence
New iOS binding layer for Flutter UI and system interactions
This change introduces a new Swift binding layer in the iOS app to bridge the Flutter UI with native iOS capabilities. It adds a DialogService for displaying alerts, a LinkRepo for handling deep links and subscription management, and a SystemNavService for opening system settings (including specific handling for macOS and DNS profile installation). The StageBinding class wires these components together, managing modal states, foreground/background events, and routing commands between the Flutter engine and native iOS services like StoreKit for subscription management.
ios/App/Binding/Stage · high confidence
New iOS permission binding layer for VPN, DNS, and notifications
The iOS app introduces a new \PermBinding\ and \PermsRepo\ module to manage system permissions. This change adds support for detecting and requesting VPN profile permissions, checking and requesting notification permissions, and managing private DNS settings (including saving and retrieving DNS profiles). It also includes logic to detect if the app is running on macOS and handles opening system settings for permission configuration.
ios/App/Binding/Perm · high confidence
New iOS utility library for logging, text formatting, and concurrency
The app now includes a new set of utility modules in the iOS codebase to support common development tasks. This adds a structured logging system (BlockaLogger) for consistent error and verbose messages, and SwiftUI text helpers (BlokadaText) that allow for styled branding and bold sections in UI strings. It also introduces a Combine-based Tasker for debouncing and managing asynchronous operations, along with extensions for date handling, JSON serialization, file merging, and safe area insets to improve UI layout and data processing capabilities.
ios/App/Util · high confidence
New location selection bottom sheet for Plus users
The app now includes a new LocationFragment that serves as a bottom sheet for selecting server locations within the Plus feature. This UI component displays a list of available gateways grouped by region (North America, Europe, Australia, and others), showing country flags and names. Users can tap a location to select it, which updates the Plus service state and dismisses the sheet. The interface also handles non-interactive states for payment-related actions and manages visual feedback like checkmarks for the currently selected server.
android/app/src/six/kotlin/ui/home · high confidence
New onboarding, rating, and stats modules for the Family variant
This change introduces the domain and UI logic for three new features in the Family app variant. The Onboard module adds a first-time welcome screen and handles deep-link navigation to specific onboarding steps (Safari, YouTube, weekly refresh) on iOS. The Rate module implements a 5-star rating flow that triggers based on usage thresholds (e.g., 100+ blocked events) and tracks metadata including freemium YouTube activation. The Stats module provides the backend for device statistics, including fetching allowed/blocked data, calculating histograms, and retrieving top-lists for domains and companies.
_common/lib/src/app\variants/family/module/stats, common/lib/src/features/onboard, common/lib/src/features/rate · high confidence
New platform-specific Private DNS setup guides for iOS, Android, and macOS
The Private DNS feature now includes dedicated onboarding sheets for iOS, Android, and macOS that guide users through the required system settings changes. These new UI components (PrivateDnsSheetIos, PrivateDnsSheetAndroid, PrivateDnsSheetMacos) provide step-by-step instructions with platform-specific icons and text, replacing the previous generic approach. The Android sheet includes scroll-to-bottom logic to ensure users see the full instructions before tapping the 'Open Settings' button, while iOS and macOS sheets provide direct navigation to system settings. A shared PrivateDnsSettingGuideWidget component standardizes the appearance of each step across platforms.
_common/lib/src/features/private\dns · high confidence
New repository layer for permissions, translations, and mock data
The app introduces a new repository package containing three key components: PermsRepo, which centralizes the logic for requesting and tracking VPN and notification permissions using Kotlin Coroutines and StateFlow; TranslationRepository, which manages multi-language support by loading and parsing JSON translation packs from assets for 21 supported languages; and MockLocationRepository, which provides a hardcoded list of server locations for testing or development purposes.
android/app/src/main/java/repository · high confidence
New reusable card component for weekly privacy reports
A new \WeeklyReportCard\ widget has been introduced in the weekly features module to display privacy pulse summaries. This component provides a consistent visual style for weekly change reports, featuring a tappable main area that triggers an action, an optional dismiss button, and support for custom content, icons, and timestamps. It is designed to be embedded within the Privacy Pulse screen to present weekly data in a standardized, interactive card format.
common/lib/src/features/weekly · high confidence
New shared UI component library and theming system
The app introduces a comprehensive set of reusable UI primitives in the common library, including a new \BlokadaApp\ entry point with Material 3 theming, an iOS-style \BackTitleNavBar\ with glass-blur effects, and a suite of components like \CommonCard\, \CommonItem\, \CommonClickable\, and \CommonDivider\. This update also adds a new \BlokadaTheme\ extension for consistent color management, a \showPauseActionSheet\ for power controls, and a \FreemiumScreen\ for upgrade prompts, while introducing a \supportedLocales\ list for internationalization.
common/lib/src/shared/ui · high confidence
New utility library for Android app development
The app now includes a new set of utility classes in the utils package to support the v6 UI redo and common module integration. AndroidUtils provides helper functions for creating PendingIntents with Android 12+ compatibility, resolving theme colors, and formatting error logs. DateUtils introduces standardized date formatting for Blokada's internal data. Intents centralizes logic for opening browser links, sharing text and files, and navigating to system settings. Logger replaces standard Android logging with a system that writes INFO, ERROR, and WARNING messages to the app's internal command log for better debugging. Notifications defines prototypes for various app notifications, including account expiration, family onboarding, and quick settings states, ensuring consistent appearance and behavior across the app.
android/app/src/main/java/utils · high confidence
New v6 module structure for freemium and onboarding flows
The v6 app variant now includes dedicated module implementations for freemium and onboarding features. The new FreemiumModule manages weekly refresh notifications and lists, ensuring these are only active for freemium users and automatically dismissing notifications when the account status changes. The V6OnboardModule handles post-payment onboarding, specifically triggering a private DNS permission sheet if DNS permissions were not granted during a successful payment. These modules replace previous implementations with a cleaner, modular structure.
_common/lib/src/app\variants/v6/module · high confidence
Spanish localization for blocklist packs and UI
Added Spanish translations for blocklist pack tags (e.g., 'recommended', 'adblocking'), pack descriptions (e.g., 'Energized System', 'DuckDuckGo Tracker Radar'), and 'Family' shield categories (e.g., 'Ads', 'Malware', 'Adult Content'). Also included Spanish strings for general UI elements, error messages, and notifications.
ios/App/Assets/es.lproj · high confidence
Stable automation identifiers for UI testing
A new \ids.dart\ file introduces a comprehensive set of stable, framework-agnostic automation identifiers (e.g., \automation.screen\_home\, \automation.nav\_back\) exposed via accessibility semantics. These constants allow the Appium test suite to reliably locate critical UI elements, navigate sub-pages, and detect blank screens, ensuring robust end-to-end testing across Flutter and native surfaces.
common/lib/src/shared/automation · high confidence
Turkish localization for blocklist packs, shields, and UI
Added Turkish translations for the blocklist tag system (e.g., adblocking, privacy, malware), descriptive text for various blocklist packs (such as Energized, hBlock, and DuckDuckGo), and the new 'Family' shield categories (including Ads, Malware, Adult Content, Dating, Gambling, Piracy, Video streaming, Streaming, Social media, Chat apps, Gaming, Games, Online shopping, and Other apps). The update also includes Turkish strings for general UI elements, error messages, and notifications.
ios/App/Assets/tr.lproj · high confidence
Weekly Privacy Pulse reports now include an opt-out toggle and backend-synced settings
Users can now control whether they receive weekly Privacy Pulse notifications via a new toggle in Settings. The system syncs this preference with the backend, allowing the app to respect the user's choice across devices and sessions. Tapping the "Turn off" action directly on a weekly report notification will navigate the user to the Settings screen to confirm the opt-out, ensuring the change is applied smoothly. Additionally, the report generation logic has been refined to gate notifications on specific content criteria (such as toplist changes or traffic deltas) to avoid sending empty or low-value alerts.
common/lib/src/features/notification · high confidence
WireGuard Android UI foundation and localization
The WireGuard Android application UI layer has been initialized with core Kotlin components, including a \ConfigStore\ interface and its \FileConfigStore\ implementation for managing tunnel configurations, alongside utility classes for data binding (\ObservableKeyedArrayList\), tunnel sorting (\TunnelComparator\), and error handling (\ErrorMessages\). The \AdminKnobs\ utility has been added to support enterprise restrictions, such as disabling configuration exports. Additionally, the app now includes extensive string resource files for localization in Arabic, Catalan, Czech, Danish, and German, covering tunnel management, import/export, and configuration error messages.
android/app/wireguard-android · high confidence
WireGuard tunnel engine integration and screen-aware connectivity
The engine module now includes the core WireGuard tunnel implementation (WgTunnel), which manages tunnel lifecycle by configuring peers, allowed IPs, and DNS based on legacy lease and gateway data, while also introducing a KeypairService for generating cryptographic keys. Additionally, a new ScreenOnService monitors device screen state to trigger connectivity actions, ensuring the tunnel behavior adapts to user presence.
android/app/src/engine · high confidence
Architecture
New platform interface definitions for app state, commands, and services
The common/libgen module now provides a set of new Pigeon-generated interface definitions that establish the contract between the Flutter application and native platform code. These interfaces cover core app status tracking (including a new paused-plus state for VPN-active pausing), command handling for deep links and lifecycle events, environment and notification management, secure persistence, family sharing, payment operations via Adapty, private DNS status checks, Plus-specific VPN configuration and gateway management, Safari setup, and modal stage control. This change introduces the structural bindings required for these capabilities but does not include the native implementations or UI logic itself.
common/libgen · high confidence
Behavioural changes
Adapty Flutter SDK upgraded to 4.0.4 with Paywall-to-Flow migration and iOS Swift Package Manager support
The vendored Adapty Flutter SDK has been updated to version 4.0.4, introducing a major behavioral change where the 'paywall' concept is generalized into 'flow' (e.g., \AdaptyPaywall\ becomes \AdaptyFlow\, \createPaywallView\ becomes \createFlowView\). This update also migrates the iOS integration to Swift Package Manager only (dropping CocoaPods), raises the minimum iOS deployment target to 15.0, and updates the Android native SDK to use Google Play Billing Library 8. Additionally, \restorePurchases()\ now completes successfully instead of failing when no purchases exist, and flow views can now be localized via a new \locale\ argument.
_common/vendor, common/vendor/adapty\flutter · high confidence
Add BlockaPacketTunnelProvider with protected HTTP and updated logging
The iOS network extension now includes a custom BlockaPacketTunnelProvider that enables protected HTTP requests (with specific headers and timeout handling) and routes logs to a shared container path compatible with Xcode 26.5+ device log fetching.
ios/WireguardCopiedFilesExtension · medium confidence
Add Xcode project schemes and IDE template macros
The Xcode project configuration now includes a set of shared schemes to support various build and development workflows. New schemes have been added for the main application variants (Prod, Dev, Mocked) and their corresponding Family app variants (FamilyProd, FamilyDev, FamilyMocked), as well as for network extension components (WGNetx, WireGuardNetExtDev) and bridge services (WGBridgeiOS, Family WGNetx). These schemes are configured to run the Flutter prebuild script before building and are set up to launch the appropriate companion app when debugging extensions. Additionally, an IDE template macro file has been added to standardize source file headers with the project's license and copyright information.
ios/IOS.xcodeproj/xcshareddata · high confidence
Added Xcode workspace configuration for Swift Package Manager
A new workspace file (contents.xcworkspacedata) has been added to the ios/.swiftpm/xcode/package.xcworkspace directory. This file configures the Xcode workspace to reference the local Swift Package Manager package, enabling proper integration and build support within the Xcode IDE for iOS development.
ios/.swiftpm · high confidence
Added empty web entry point
An empty index.html file has been added to the common/web directory, serving as a placeholder to enable the web build process.
common/web · low confidence
Android app integrates new common module via symlink
The Android application now references the new common module by creating a symbolic link at \android/app/src/main/java/channel\ pointing to the generated pigeon code in the common module's build directory. This structural change allows the app to access shared code generated by the common module's build process.
android/app/src/main/java · high confidence
Android build system restructured with new Makefile and Gradle wrapper
The Android build process is now managed via a new Makefile that provides explicit targets for building and installing APKs and AABs for both 'family' and 'six' variants in release and debug modes. The project now includes the standard Gradle wrapper scripts (gradlew and gradlew.bat) to ensure consistent builds, and the .gitignore has been updated to exclude local dependencies, Copilot settings, and keystore files.
android · high confidence
Android v6 flavor introduces flavor-specific defaults, FCM push support, and dedicated crash logging
The Android v6 flavor now includes its own set of service implementations that change how the app handles configuration, notifications, and stability. Default DNS settings are now explicitly defined for this flavor (Cloudflare). Push notifications are supported via a new Firebase Cloud Messaging integration that registers tokens and processes incoming message payloads. Uncaught exceptions are now captured and written to a dedicated crash log file (blokada-a6.crash) before the process terminates. Additionally, the sheet service has been updated to immediately dismiss QR-based account change modals for this flavor, reflecting the removal of that specific flow.
android/app/src/six/kotlin/service · high confidence
Appium test suite restructured for stability and performance
The Appium automation framework has been updated to improve reliability and reduce execution time. The test configuration now groups specs by account state (inactive vs. active) to restore the test account only once per group rather than per individual test, significantly cutting down on app relaunch overhead. Stability is enhanced by waking the device before each session to prevent WebDriverAgent launch failures on locked screens, and by locking the device screen after each spec using a direct IOHID power press to avoid timeouts associated with the WDA lock method. Additionally, the suite now captures screenshots and page sources on hook failures to provide visual evidence when tests abort before reaching their main body, and preserves iOS keyboard preferences during sessions to prevent WDA from resetting auto-correction and predictive settings.
automation/appium/wdio · high confidence
Common module restructured with Flutter 3.44.6, iOS build fixes, and new build tooling
The common module has been reorganized to support a feature-first layout and updated to Flutter 3.44.6 via FVM. iOS builds now use Swift packages instead of CocoaPods, with a new script to pin the deployment target to iOS 15.0 to satisfy Xcode 27 requirements. The Adapty SDK has been migrated to version 4.0 (Flow), and the \input\_code\_field\ package has been vendored to ensure compatibility with the newer Flutter SDK. A new Makefile standardizes build targets for Android and iOS, and generated platform bindings are now managed via Pigeon.
common · high confidence
Enhanced Appium test reliability with account state caching and visual regression support
The Appium test suite now includes support files that improve execution speed and debugging capabilities. Account state is cached per run to avoid expensive app relaunches when switching between active and inactive accounts within the same test group. Additionally, new utilities allow automatic capture of failure artifacts (screenshots, page source, syslog) and introduce pixel-perfect visual regression testing with configurable masking and retry logic for dynamic UI elements like paywalls.
automation/appium/wdio/src/support · high confidence
Family DNS permission logic now supports coexistence with Blokada 6 on parent devices
The Family app variant now detects when a parent device is already managed by Blokada 6 and, in that case, skips its own DNS setup to avoid conflicts. This coexistence check applies only to parent devices; linked child devices continue to configure their own Family DNS for parental filtering regardless of the parent's status. The change introduces a new permission module that handles DNS state checks and updates based on this logic.
_common/lib/src/app\variants/family/module/perm · high confidence
Family home screen redesign with animated backgrounds and device management
The Family variant's home screen has been completely overhauled with a new visual identity and improved device management. The interface now features animated gradient backgrounds and a dynamic logo/icon display that animates during transitions. Device management has been enhanced with a two-pane layout for wider screens, swipeable device cards for quick actions, and a dedicated confirmation dialog to prevent accidental re-homing of devices via incoming links. The linking process has been refined to update devices in place rather than recreating them, ensuring QR codes remain valid and avoiding orphaned child devices. A new macOS-specific linking sheet allows manual link entry for platforms without QR scanning capabilities.
_common/lib/src/app\variants/family/widget/home · high confidence
Family module restructured to support Blokada 6 coexistence and in-place device linking
The Family module has been refactored to manage coexistence with Blokada 6 and improve the device linking experience. The app now detects if Blokada 6 owns local DNS protection on the parent device and, if so, suppresses the local "this device" row to prevent conflicts, while still allowing child devices to function. Additionally, the linking process has been updated to modify existing devices in place (updating names and profiles) rather than recreating them, and a confirmation step is now enforced before an incoming link re-homes a device with an active account.
_common/lib/src/app\variants/family/module/family · high confidence
Family schedule rules now support time windows that wrap to the next day
The schedule module now correctly handles time windows that cross midnight (e.g., 21:00–07:00). Previously, such rules might have been evaluated incorrectly or not at all; now, the client-side resolver and active-profile logic treat a wrap-around window as a single continuous period owned by the start day, ensuring that the early-morning carry-over is matched against the previous calendar day's schedule. This change aligns the client's behavior with the server's enforcement and ensures that bedtime or overnight rules apply as intended across day boundaries.
_common/lib/src/app\variants/family/module/schedule · high confidence
French localization for blocklist packs and UI
The app now includes French translations for blocklist pack names, descriptions, and shield categories (such as Ads, Malware, and Adult Content), as well as comprehensive UI strings for error messages, navigation tabs, and home screen status indicators.
ios/App/Assets/fr.lproj · high confidence
Integrates the new sixcommon module into the iOS workspace
The iOS project workspace has been updated to include the new sixcommon module, introducing a set of shared utility files in the WireguardCopiedFiles directory. This addition provides core infrastructure for the app, including a standardized error presentation system (ErrorPresenter), a tracker for recently activated tunnels (RecentTunnelsTracker), and a central manager for monitoring tunnel states and list changes (TunnelsTracker). It also adds supporting types such as WireGuardAppError and WireGuardResult, along with localization and logging helpers, to support the broader integration of the sixcommon framework.
ios/IOS.xcodeproj/project.xcworkspace, ios/WireguardCopiedFiles · high confidence
Introduce family flavor with platform-specific service implementations
This change adds a new 'family' application flavor to the Android app, providing specific implementations for core services to support a distinct product variant. The diff introduces binding logic for sharing URLs via Android intents, stubs for engine and keypair services (notably disabling keypair generation), and configuration defaults such as setting Cloudflare as the DNS provider. It also defines a simplified sheet service that restricts available UI modals to account-related QR scanning and implements a custom uncaught exception handler that logs fatal crashes to a local file.
android/app/src/family/kotlin · high confidence
Introduce v6 adaptive layout for Activity, Privacy Pulse, and Advanced tabs
The v6 app variant now features a redesigned main interface with adaptive layouts for the Activity, Privacy Pulse, and Advanced tabs. On expanded windows (tablets/widescreen), the Activity and Privacy Pulse screens switch to a split-pane view where the main list or chart acts as the master pane and domain details appear in a side panel, while the Advanced tab's filter cards reflow into a balanced two-column grid. The new tab navigation includes a badge for unseen weekly reports, and all screens integrate a freemium overlay when the user is on a free plan.
_common/lib/src/app\variants/v6/widget · high confidence
Introduction of Flutter-based Home Fragment and Payment Terms UI
The app now uses a new FlutterHomeFragment to render the home screen via a Flutter engine, replacing the previous native implementation. This fragment manages its own cached engine instance and lifecycle callbacks. Additionally, a new PaymentTermsFragment has been added to handle payment-related terms, privacy, and support links within a bottom sheet UI, wired to the application's navigation and service bindings.
android/app/src/main/java/ui/home · high confidence
Introduction of Flutter-based Home view
The Home screen now utilizes a new SwiftUI wrapper (FlutterHomeView) to embed a Flutter engine, replacing the previous native implementation. This change integrates the 'sixcommon' module's Flutter engine into the iOS app's home interface, allowing the home view to be rendered via Flutter.
ios/App/UI/Home · high confidence
Introduction of centralized Android service layer
The app now includes a new set of core service classes in the \service\ package to manage foundational Android capabilities. This includes \AlertDialogService\ for displaying user alerts, \BiometricService\ for handling fingerprint/FaceID authentication, \ConnectivityService\ for monitoring network status and changes, and \ContextService\ to manage application context lifecycle. Additional services handle device boot events (\BootReceiver\), doze mode restrictions (\DozeService\), file and shared preferences storage (\FileService\, \StorageService\), HTTP requests (\HttpService\), and permission requests for VPN and network monitoring (\VpnPermissionService\, \NetworkMonitorPermissionService\). This refactoring centralizes these system interactions into dedicated, reusable components.
android/app/src/main/java/service · high confidence
Introduction of core data models and error handling utilities
The application model layer now includes foundational data structures and utilities to support the new common module integration. This change introduces the \App\ class and \BypassedAppIds\ for managing VPN bypass lists, defines the \AppState\ enum to track VPN status (Deactivated, Paused, Activated), and establishes the \Tab\ enum for navigation routing. Additionally, it adds specific exception classes (such as \TunnelFailure\ and \NoPermissions\) with helper functions to map technical errors to user-friendly messages, and defines type aliases for product and permission identifiers.
android/app/src/main/java/model · high confidence
Italian localization for blocklist packs, shields, and UI
The Italian language resources for the iOS app have been populated with new translation files. Users will now see Italian translations for blocklist search tags (such as 'adblocking', 'privacy', and 'malware'), detailed descriptions and names for various blocklist packs and family shields (including Ads, Malware, Adult Content, and Social media), and the core application interface strings (including error messages, navigation tabs, and home screen status indicators).
ios/App/Assets/it.lproj · high confidence
Migrate payment integration to Adapty SDK 4.0 with new Flow-based paywalls
The payment feature has been updated to use Adapty SDK 4.0, replacing the previous 3.x integration with a new 'Flow' architecture for displaying paywalls. This change introduces a new \AdaptyPaymentChannel\ that utilizes \AdaptyUIFlowView\ for localized paywall rendering and handles purchase/restore callbacks more robustly. A key behavioral improvement is the addition of active-access validation: the system now checks if a purchase or restore result actually grants an active entitlement level before proceeding to checkout, preventing spurious 'payment failed' errors from expired or replayed transactions. The migration also includes a new \PaymentActor\ to manage the payment lifecycle, an \AdaptyAttributeConverter\ for sanitizing custom user attributes, and a \MockPaymentChannel\ to support iOS Simulator development by bypassing the real SDK initialization.
common/lib/src/features/payment · high confidence
Mocked target now provides specific service implementations for testing
The ServiceMock module now includes a dedicated ServicesForMocked.swift file that defines a singleton container for services used in mocked scenarios and tests. This file explicitly instantiates mock versions of core services, including PrivateDnsServiceMock, NetxServiceMock, and DialogService, ensuring that the mocked target uses these specific implementations rather than the production ones.
ios/App/ServiceMock · high confidence
New API client with retry logic and freemium mock data
The API layer has been refactored into a new client structure that automatically retries failed requests up to three times and provides mock data for specific endpoints (stats, journal, lists, device) when the user is on a freemium account. This change introduces a new \Api\ class and associated HTTP handling modules, replacing the previous implementation to improve reliability and support offline/freemium development workflows.
common/lib/src/features/api · high confidence
New MiniCard UI components for domain details
The domain details view now uses a new set of reusable UI components located in the minicard module to display statistics. This includes a sparkline chart (MiniCardChart) that visualizes allowed traffic data using a spline series, an animated numeric counter (MiniCardCounter), a structured header (MiniCardHeader), and a summary layout (MiniCardSummary) that combines these elements. These components replace previous implementations to provide a consistent visual style for total counters and usage trends.
common/lib/src/shared/ui/minicard · high confidence
New before-paywall onboarding flow for Safari extension setup
Users on freemium accounts can now complete the Safari extension setup as part of the Essentials onboarding before encountering the paywall. This change introduces a dedicated onboarding sheet that guides users through enabling the extension, with a specific "Setup Later" option that allows them to bypass the setup and proceed directly to the payment screen. The implementation includes new domain logic to manage the mandatory onboarding state and UI components to render the step-by-step guide.
common/lib/src/features/safari · high confidence
New core infrastructure for environment detection, structured logging, and event-driven state management
The common core library has been restructured to introduce a comprehensive set of foundational utilities. Environment and runtime detection are now handled by the \Act\ mixin and \ActScenario\ enum, allowing the app to distinguish between production, family, test, and mocked scenarios. Logging has been upgraded to a structured, marker-based system (\LogTracerActor\) that groups logs by execution chain, supports sensitive parameter obfuscation, and detects slow operations. State management now includes a new \Emitter\ mixin for event-driven notifications and \AsyncValue\ classes for reactive, persistable state. Additionally, the localization service (\I18nService\) has been updated to use the supported \AssetManifest\ API, fixing a crash on Flutter 3.44 where the legacy \AssetManifest.json\ was no longer available.
common/lib/src/core · high confidence
New family device management module with temporary mode overrides and scheduled seeding
The family variant now includes a new device management module (device\_v3) that introduces temporary, time-bound device mode changes (on/off/blocked) via a new \mode\_until\ field, allowing modes to automatically revert to their scheduled state. The module also implements a new device linking flow that updates existing devices in place rather than recreating them, and automatically seeds newly linked child devices with predefined 'School' and 'Bedtime' profiles and schedules. Additionally, it adds an authentication actor to manage token lifecycles with heartbeats and refreshes, and fixes a configuration separator typo in the device naming generator.
_common/lib/src/app\_variants/family/module/device\v3 · high confidence
New filter selection UI and domain model
The filter feature now uses a redesigned domain model and UI. The new \FilterActor\ manages filter state and resolves list tags, while \FilterWidget\ and \FilterOptionWidget\ provide a card-based interface for selecting filters and their options. The domain layer introduces \FilterDecor\ for metadata (titles, descriptions, tags) and \KnownFilters\ to map app filters to underlying blocklists, with separate configurations for standard and family app flavors.
common/lib/src/features/filter · high confidence
New iOS native binding layer for Flutter communication
The iOS app now uses a new native binding layer (AppBinding, CommandsBinding, CommonBinding, etc.) to handle communication with the Flutter UI. This introduces structured Swift classes that implement generated Pigeon protocols, managing app state, command execution with queuing and timeouts, HTTP requests, logging, notifications, and URL launching. Users benefit from more reliable command handling and better integration between native iOS features and the Flutter interface.
ios/App/Binding · high confidence
New modal domain model and actor for managing sheet lifecycle
The modal feature now uses a dedicated domain model (Modal enum) and a ModalActor to manage the current modal state, replacing previous ad-hoc approaches. This change introduces a more reliable lifecycle management for modals, specifically addressing issues with dismiss races and deduplication that previously caused multiple sheets to stack during cold starts. The ModalActor now relies on the BottomManagerSheet to clear the modal value upon dismissal, ensuring accurate state tracking.
common/lib/src/features/modal/domain · high confidence
New modal presentation system with adaptive layouts and blur backgrounds
The modal UI layer has been refactored to use a new presentation architecture. A new BlurBackground widget provides animated, blurred overlays for modals. The BottomManagerSheet now handles bottom sheets with adaptive layouts, switching between a floating modal style on wider screens (tablets/desktop) and standard bottom sheets on mobile, while also allowing drag events to be disabled for specific modals like the Adapty paywall. Additionally, an OverlaySheet component manages full-screen overlays for specific modal types such as lock screens, rating prompts, and onboarding flows.
common/lib/src/features/modal/ui · high confidence
Plus feature domain logic and UI components restructured
The Plus feature's internal architecture has been reorganized into distinct domain modules for keypair, gateway, lease, VPN, and app bypass, each with dedicated actors, API clients, and state values. This change introduces a new app bypass system that allows users to exclude specific installed applications from the VPN tunnel on Android, complete with a default list of system apps and a UI dialog for managing exclusions. Additionally, the VPN connection logic has been refined to handle configuration changes and status transitions more robustly, and a new device limit modal has been added to guide users when they reach their maximum number of connected devices.
common/lib/src/features/plus · high confidence
Redesigned device detail screen with schedule rules and timed overrides
The Family device detail screen has been rebuilt to consolidate device settings, activity stats, and scheduling into a single master-detail view. Users can now manage device schedules by creating, editing, and reordering rules that apply specific profiles or block internet during defined time windows. A new 'Now' section provides a live readout of the device's current state, allowing parents to apply temporary overrides (such as blocking internet or pausing filtering) with automatic expiration. The interface also includes a refreshed profile editor for managing blocklists and safe-search settings directly from the device context.
_common/lib/src/app\variants/family/widget/device · high confidence
Redesigned home device cards with active profile labels
The home screen device cards now display a chevron label indicating the device's current active state (such as a manual override, schedule rule, or default profile) by resolving the effective state in real-time. This change introduces a new \HomeDevice\ widget and a dedicated \DeviceCardHeader\ component to present the device name, icon, and the dynamic status label, ensuring the home view accurately reflects the device's operational context without requiring a manual refresh.
_common/lib/src/app\variants/family/widget/home/device · high confidence
Redesigned home screen with v6 widget components
The home screen UI has been rebuilt using a new set of v6 widgets, introducing distinct views for freemium and paid users. Freemium users now see a dedicated status card with an upgrade call-to-action, while paid users see a daily stats counter and a Plus location switch. The main power button now features a detailed loading animation and a pause timer that only appears when a pause value is set.
_common/lib/src/app\variants/v6/widget/home · high confidence
Redesigned paywall layout and restored Quick Settings tile functionality
The app now displays the Adapty paywall in a centered, constrained layout on tablets (screens wider than 500dp) to match the iOS experience, replacing the previous full-width presentation. Additionally, the Android Quick Settings tile has been re-implemented to reliably toggle the VPN on and off and reflect the current status, fixing previous issues where the tile was missing or unresponsive.
android/app/src/main/java/ui · high confidence
Redesigned settings hub with master-detail layout and new privacy controls
The Settings screen now uses a master-detail layout on wider screens, allowing users to select a section (such as Exceptions or Retention) to view its details in a side pane. This update introduces a new Exceptions management interface where users can view and remove blocked or allowed domains, and adds a new Activity Retention section that lets users toggle a 24-hour data retention policy. The settings list items now feature a unified selection style and improved accessibility identifiers to support automated testing.
common/lib/src/features/settings · high confidence
Redesigned stats and activity views with new UI components
The stats and activity sections have been rebuilt with a new set of UI components, introducing a horizontal radial chart for privacy pulse metrics, a dedicated domain detail view with action items and information cards, and a refined activity list with segmented controls for filtering between blocked and allowed entries. Users will see updated visualizations for daily stats, improved detail screens for specific domain interactions, and a more structured activity feed with enhanced filtering capabilities.
common/lib/src/features/stats · high confidence
Refactored app startup and account management architecture
The app's initialization and account handling have been restructured to improve reliability and user experience. Startup logic is now gated by a \StartupPromotionGate\ that defers foreground operations until the UI is mounted, preventing premature permission dialogs and navigation races. Account management has been split into dedicated \AccountStore\ and \AccountRefreshStore\ components, introducing robust retry loops for initialization and the ability to create new accounts when existing ones return 400/404 errors. Additionally, a \StartupFirstFrameReporter\ ensures the native splash screen is removed precisely when Flutter renders its first frame, eliminating blank-screen flashes.
common/lib/src/platform · high confidence
Refactored navigation infrastructure and route handling
The navigation system in the common library has been restructured to improve route management and UI consistency. A new centralized navigation module defines application paths (such as device, settings, activity, and privacy pulse) and handles route generation, including specific logic for the Privacy Pulse screen to accept initial time-range arguments. A new StandardRoute class implements custom transition animations that synchronize with the top bar's state during page transitions. Additionally, a navigation observer now automatically resets journal filters when leaving the device section and manages support section flags, while also handling legacy tab state for non-family app variants.
common/lib/src/shared · high confidence
Refreshed profile selection dialog with unified avatar and full-page editor access
The family profile selection dialog has been redesigned to improve visual consistency and management depth. It now uses a shared ProfileAvatar component that displays deterministic colored initials (or specific icons for parent/child templates) instead of generic icons, ensuring profiles are easily identifiable at a glance. The dialog also replaces the previous limited rename-only interaction with a direct link to the full-page Profile Editor, allowing users to manage rename, blocklists, safe-search, and deletion from a single, canonical interface.
_common/lib/src/app\variants/family/widget/profile · high confidence
Restored device log fetching for Xcode 26.5+ compatibility
The LoggerSaver service now stores logs in the standard Library/Application Support/Blokada subdirectory instead of the container root. This change ensures that the devicectl tool in Xcode 26.5 and later can successfully list and copy log files, resolving previous issues where logs were inaccessible due to location restrictions. The service also includes logic to migrate any existing legacy log files from the root directory to the new location.
ios/App/ServiceImpl · high confidence
Streamlined iOS local run and mocked-simulator targets
The iOS build system now provides simplified Make targets for running the app locally and on mocked simulators. A new run-helpers.mk module standardizes device selection, allowing builds to target paired physical iOS devices or Macs (Designed for iPad) via the new run-app macro. Additionally, sim-helpers.mk introduces worktree-aware mocked-simulator runners (run-six-mocked, run-family-mocked) that automatically provision isolated simulator clones based on the project directory, seed development accounts via dart-defines, and handle the build-install-launch cycle for mocked schemes without manual setup.
ios/make · high confidence
Swedish localization for blocklist packs, shields, and UI
The Swedish language resources for the iOS app have been updated with new translation files. \PackTags.strings\ adds Swedish labels for blocklist search tags (e.g., 'recommended', 'adblocking', 'privacy'). \Packs.strings\ provides Swedish names and descriptions for various blocklist packs and 'Family' shields (such as Ads, Malware, Adult Content, and Gaming), along with filter options like 'Primary' and 'Extended'. \Ui.strings\ contains a comprehensive set of Swedish translations for the user interface, including error messages, action buttons, tab labels, and status indicators.
ios/App/Assets/sv.lproj · high confidence
Unified startup entrypoints and adaptive tablet layout system
The common module now provides a single, unified entrypoint (main.dart) that manages app initialization for both production and mocked builds, including automatic dev account seeding and synthetic DNS traffic generation for the Family and v6 flavors. This change also introduces a new adaptive layout system for wide screens, replacing the previous static tablet detection with a reactive WindowShape classifier that supports dynamic master-detail splitting, proper handling of iPad Split View and macOS window resizing, and a centralized routing registry (DetailRoutes) to ensure consistent navigation and UI behavior across phone and tablet modes.
common/lib · high confidence
iOS Safari extension resources replaced with obfuscated JavaScript
The iOS Safari extension's resource files (background.js, content.js) have been replaced with heavily obfuscated JavaScript code. This change introduces minified and encoded logic for the extension's background and content scripts, likely to protect intellectual property or prevent tampering, while maintaining the core functionality of the BlockaWebExtension.
ios/BlockaWebExtension/Resources · high confidence
iOS app configuration and asset infrastructure overhaul
The iOS application's configuration and asset layer has been restructured to support distinct product flavors and modernized resource management. Two separate Info.plist files (Info-six.plist and Info-family.plist) are now used to configure flavor-specific behaviors, including deep-link URL schemes (six:// and family://), background modes for notifications and background tasks, and associated domains. A new entitlements file explicitly grants network extension capabilities for DNS settings and packet tunneling, alongside iCloud container and app group access. App constants have been centralized, introducing a 15-second HTTP timeout and a 0.3-second UI interaction debounce. Error handling is now standardized through a CommonError enum with localized descriptions, and UI resources (colors, images, and strings) are managed via generated Swift extensions to ensure type-safe access to assets.
ios/App/Assets · high confidence
iOS app lifecycle and background task handling restructured
The iOS application entry points (AppDelegate and SceneDelegate) have been rewritten to use the modern UIScene lifecycle, ensuring that foreground/background state transitions and notification hooks are correctly handled on iPad and macOS in addition to iPhone. A new background ping mechanism using BGTaskScheduler has been introduced to periodically wake the app and sync with the backend, replacing previous background execution patterns. Additionally, the app now supports dynamic home screen quick actions (Start, Stop, Pause) that update based on the current connection state, and URL handling for universal links is centralized in the SceneDelegate.
ios/App/Service · high confidence
iOS build system restructured with Makefile, FVM, and simulator support
The iOS project has been reorganized to streamline local development and CI workflows. A new Makefile provides targets for building and running both the 'six' and 'family' app flavors on physical devices and simulators. Flutter version management is now handled via FVM (\.fvmrc\), ensuring consistent tooling. Simulator development is enhanced with 'mocked' schemes that stub network extensions and payment services, allowing UX and API integration testing without real VPN entitlements. The build process now uses \xcconfig\ files for signing and versioning, and includes support for Appium testing against simulators.
ios · high confidence
iOS project restructured with new Swift components and WireGuard integration
The iOS Xcode project has been reconfigured to include a comprehensive set of new Swift source files and framework references. This update introduces native Swift components for the user interface and application logic, including views like MainView and FlutterHomeView, services for system navigation and private DNS, and utilities for localization and keychain access. Additionally, the project now explicitly integrates the WireGuard network extension, adding the necessary PacketTunnelProvider and related configuration files to support VPN functionality, while also linking against FirebaseCore and FlutterNativeIntegration frameworks.
ios/IOS.xcodeproj · medium confidence
Fixes
Fixes build failure for the 'family' flavor caused by minification
The 'family' build variant was failing because enabling minification (ProGuard/R8) stripped essential Flutter plugin registration code and Adapty SDK classes. This change introduces a specific ProGuard rules file (proguard-family.pro) that preserves the Flutter plugin auto-registration mechanism and the Adapty Android/Flutter plugin entry points, ensuring the app builds and runs correctly with code shrinking enabled.
android/app · high confidence
Test coverage
Added Playwright UI tests for the Safari extension popup; Added iOS smoke test suite for core app functionality; Added test fixtures and unit tests for the Journal module; Added test for preloaded startup modal display; Added test infrastructure and unit tests for common module startup logic; Added tests for Family device visibility and linking logic; Added tests for Family variant device and home widgets; Added tests for Plus domain features; Added tests for WeeklyRefreshActor freemium cancellation logic; Added tests for adaptive layout and detail pane routing; Added tests for app store lifecycle, launch context, and startup promotion logic; Added tests for device actor optimistic updates and profile deletion safety; Added tests for device bootstrap identity and store logic; Added tests for filter default template fallback behavior; Added tests for link template resolution, notification budgeting, and weekly report logic; Added tests for profile JSON parsing and payment attribute conversion; Added tests for stats delta calculations and baseline merging; Added tests for support chat actor, link styling, and composer behavior; Added unit tests for Combine, Model, and Tasker components; Added unit tests for StageStore lifecycle and routing; Added unit tests for account refresh and expiration logic; Added unit tests for account store, API, and command store; Added unit tests for cooldown and emitter utilities; Added unit tests for core common library components; Added unit tests for home screen power button and radial chart logic; Added unit tests for notification command registration and FCM event handling; Added unit tests for platform permission actor and DNS check logic; Added unit tests for the AppStartStore lifecycle; Added unit tests for the Appium AI Explorer automation framework; Added unit tests for the family schedule module.
Dependencies
Added submodule dependencies for WireGuard Apple, translations, and landing page
The project now includes three new Git submodules to manage external dependencies: \wireguard-apple\ for Apple platform support, \translate\ for internationalization strings, and \landing-github-pages\ for the landing site. These submodules are registered in the \deps/\ directory, allowing the main repository to track specific commits of these external components.
deps · high confidence
Android build infrastructure upgraded to AGP 9.3.1 and compileSdk 37
The Android build configuration has been updated to use Android Gradle Plugin 9.3.1 and target compileSdk 37, with the application targetSdkVersion set to 36. The project now requires a Java/Kotlin JVM toolchain of version 17 and enables minification for release builds. Additionally, the build defines two product flavors, 'six' and 'family', to support distinct app variants.
(dependencies) · high confidence
Gradle wrapper distribution files added
The Gradle wrapper distribution files for version 8.13 have been added to the project, including the lock and partial download files. This ensures the build environment is correctly configured to use this specific Gradle version.
.gradle · high confidence
Gradle wrapper upgraded to version 9.7.1
The Android build system now uses Gradle 9.7.1 (via the wrapper configuration) instead of the previous version. This update ensures that builds are executed with the newer Gradle runtime, which may include performance improvements, bug fixes, and compatibility changes for the Android Gradle Plugin.
android/gradle · 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
This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.
Score
- CAI 57 → 67 (+9.6)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 67 → 65 (-1.6)
- Architecture 100 → 99 (-1.4)
- Maturity 64 → 67 (+2.6)
- Readiness 50 → 65 (+14.9)
- Security 52 → 70 (+18.0)
- Domain Modelling 100 → 73 (-27.1)
Resolved (23)
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- High CVE: [GHSA redacted] (automation/appium/wdio/package-lock.json)
- High CVE: [GHSA redacted] (automation/appium/wdio/package-lock.json)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- High: security finding (details withheld)
- Medium CVE: [GHSA redacted] (ios/Gemfile.lock)
- No exposed public API
- Off-boarding risk: anonymized user #1
- Off-boarding risk: anonymized user #2
- …and 3 more
New (283)
- AppStartStoreBase.onAppStatus (cognitive 35) (common/lib/src/platform/app/start/start.dart)
- AppStartStoreBase.onAppStatus (cyclomatic 22) (common/lib/src/platform/app/start/start.dart)
- AppStatusStrategy.getCurrentStatus (cognitive 28) (common/lib/src/platform/app/app.dart)
- AppStatusStrategy.getCurrentStatus (cyclomatic 24) (common/lib/src/platform/app/app.dart)
- Base-context workflow trigger runs with an unscoped token
- Change coupling: activity_screen.dart ↔ domain_detail_section.dart (common/lib/src/app_variants/v6/widget/activity_screen.dart)
- ClassTooLong: DomainDetailSectionState (common/lib/src/features/stats/ui/domain_detail_section.dart)
- ClassTooLong: L10n (ios/App/Assets/UiGen.swift)
- ClassTooLong: _RuleEditorSheetState (common/lib/src/app_variants/family/widget/device/rule_editor_sheet.dart)
- CustomlistActor.getRelevantRulesForDomain (cognitive 19) (common/lib/src/features/customlist/domain/actor.dart)
- CustomlistActor.getRelevantRulesForDomain (cyclomatic 18) (common/lib/src/features/customlist/domain/actor.dart)
- DeviceSectionState._openRuleEditor (cognitive 16) (common/lib/src/app_variants/family/widget/device/device_section.dart)
- DeviceSectionState.build (cognitive 21) (common/lib/src/app_variants/family/widget/device/device_section.dart)
- DeviceSectionState.build (cyclomatic 17) (common/lib/src/app_variants/family/widget/device/device_section.dart)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- DomainDetailSectionState._fetchRecentActivity (cognitive 19) (common/lib/src/features/stats/ui/domain_detail_section.dart)
- DomainDetailSectionState._fetchRecentActivity (cyclomatic 16) (common/lib/src/features/stats/ui/domain_detail_section.dart)
- DomainDetailSectionState._fetchSubdomains (cognitive 46) (common/lib/src/features/stats/ui/domain_detail_section.dart)
- DomainDetailSectionState._getSubtitleText (cognitive 144) (common/lib/src/features/stats/ui/domain_detail_section.dart)
- …and 263 more
Changes since last survey
- 60 commits — 52 feature/other, 8 fixes
By area
- android/app — 12 commits
- automation/appium — 12 commits
- .github/workflows — 10 commits
- common/pubspec.lock — 9 commits
- common/lib — 6 commits
- common/vendor — 2 commits
- (repo) — 1 commit
- (root) — 1 commit
- .agents/skills — 1 commit
- .github/dependabot.yml — 1 commit
- android/build.gradle — 1 commit
- android/gradle — 1 commit
- common/Makefile — 1 commit
- common/pubspec.yaml — 1 commit
- ios/BlockaWebExtension — 1 commit
Notable commits
- fix: Fix invisible chat links in the sent bubble (#1219)
- fix: fix(account): show the account-expired notification once per lapse (#1243)
- fix: fix(adapty): vendor adapty_flutter 4.0.4 and pin the Android BOM to the bridge's native version (#1228)
- fix: fix(android): support chat unusable behind the keyboard on old Android (#1250)
- fix: fix(appium): lock the CI phone with an IOHID power press, not WDA lock (#1261)
- fix: fix(ios): pin generated Podfile deployment target to 15.0 for Xcode 27 (#1260)
- fix: fix(notification): rescue notification copy — abbreviated count + CTA (#1244)
- fix: fix(payment): only run checkout when the Adapty profile has active access (#1258)
- change: Migrate Adapty SDK to 4.0 (Paywall → Flow) + iOS Swift-package pipeline (#1214)
- change: Pin Appium xcuitest driver to 10.28.1 (#1220)
- change: Retention rescue notification + winback tap (#300) (#1225)
- change: build(deps): bump androidx.navigation:navigation-safe-args-gradle-plugin (#1231)
- change: build(deps): bump anthropics/claude-code-action (#1213)
- change: build(deps): bump anthropics/claude-code-action (#1218)
- change: build(deps): bump anthropics/claude-code-action (#1224)
- change: build(deps): bump anthropics/claude-code-action (#1233)
- change: build(deps): bump anthropics/claude-code-action (#1249)
- change: build(deps): bump anthropics/claude-code-action (#1257)
- change: build(deps): bump anthropics/claude-code-action (#1266)
- change: build(deps): bump anthropics/claude-code-action (#1272)
- …and 40 more
Architecture
- Containers 0 added · 0 removed · contexts 1 added · 1 removed · edges 0 added · 0 removed
Added bounded contexts (1)
- app
Removed bounded contexts (1)
- android
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
blokadaorg/blokada 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 23 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 29fe17166c9617712f2493d99c3abb52e7ef8d28 — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-955b9cee9818.