Privoo for Android
From the Privoo reference.
This article is about the Android browser. For the desktop browser, see Privoo Desktop. For the coding IDE, see Privoo Coder.
Privoo for Android is a native Android web browser built with Kotlin and Jetpack Compose. It reproduces the visual language of Privoo Desktop, including the dark canvas, floating rounded toolbar, pill-shaped address bar and ghost mascot home page, but it is a separate application: a native Android build rather than a port of the desktop code, using the Android WebView engine instead of Chromium via Electron.
It differs from Privoo Desktop in two respects that matter before installing: it is closed source, and it has no automatic updates. It is distributed as an APK through a Proton Drive link posted in the project's Discord server rather than through Google Play.
Distribution and licensing
Privoo for Android is closed source. This is a deliberate divergence from Privoo Desktop, which is MIT licensed and publicly readable. The practical consequence should be stated plainly, because it is the same standard this reference applies to Privoo Desktop: the claims made below about the Android application cannot be independently verified by reading its code, and users are being asked to take them on trust in a way that Privoo Desktop does not require.
There is also no automatic update mechanism. Privoo Desktop checks the GitHub release feed and updates itself; the Android application does neither. Obtaining a newer version means returning to the Discord server, downloading the current APK from the Proton Drive link, and installing it over the existing app. Users should expect to do this manually, and should not assume an installed copy is current.
| Step | Detail |
|---|---|
| 1. Join Discord | The Privoo Discord server. |
| 2. Find the link | The APK is hosted on Proton Drive; the link is posted in the server. |
| 3. Install | Sideload the APK. Android will require permission to install from an unknown source. |
| 4. Update | Manually, by repeating the above. There is no in-app updater. |
Because the application is not distributed through Google Play, it is not subject to Play's review process, and installing it requires enabling installation from unknown sources. Only install an APK obtained from the project's own Discord server, and treat any copy found elsewhere as untrusted.
Architecture
The application is fully native rather than a wrapped web view of the desktop interface. It follows contemporary Android architecture:
| Layer | Technology |
|---|---|
| Language | Kotlin |
| UI | Jetpack Compose, Material 3 |
| Architecture | MVVM with Clean Architecture layering |
| Dependency injection | Hilt |
| Persistence | Room |
| Settings | DataStore |
| Navigation | Navigation Compose |
| Concurrency | Coroutines with StateFlow |
| Rendering engine | Android WebView |
| Activity model | Single activity, edge-to-edge Compose host |
The codebase is separated into a core layer facing the Android
framework (tabs, WebView clients, tracker blocking), a data layer
(Room database, DataStore, repositories), a pure domain layer (models
and repository interfaces), and a ui presentation layer built from
Compose screens and view models.
Because the engine is Android's system WebView rather than a bundled Chromium, the browser inherits the rendering behaviour and update cadence of the WebView component on the user's device. This is the root cause of the encrypted DNS limitation described below.
Features
| Area | Provided |
|---|---|
| Tabs | Multiple tabs, private tabs, switcher with previews, reopen closed tab |
| Privacy | Tracker blocking, HTTPS-only, third-party cookie blocking, UA protection |
| Privacy Shield | Session and lifetime blocked counts, plus a home-screen widget |
| Data | Room history and bookmarks, JSON import/export, session persistence |
| Downloads | In-app engine with pause, resume, cancel, live speed and ETA |
| Media | HTML5 fullscreen video, file uploads |
| Themes | Light, dark, system, AMOLED, selectable accent |
| Layout | Optional bottom toolbar position |
| Encrypted DNS | Deep-links to Android Private DNS |
Browsing
- Multiple tabs, with a Chrome-style switcher showing previews.
- Private tabs, kept separate and never written to storage.
- Reopen closed tab, for the usual mistake.
- Popups open as new tabs rather than being discarded or blocked outright.
- External scheme handoff, so links belonging to other applications open in them.
- HTML5 fullscreen video and file uploads, both of which a bare WebView does not provide without work.
- Permission prompts for camera, microphone and geolocation.
- Downloads and sharing through the system.
- Pull-to-navigate home, a gesture rather than a button.
Privacy
- Tracker blocking using a hostname blocklist, applied to requests.
- HTTPS-only upgrading of insecure connections.
- Third-party cookie blocking to limit cross-site correlation.
- Fingerprint protection via User-Agent handling.
- JavaScript and cookie toggles, for users who want them off entirely.
- Private tabs that are never persisted.
- One-tap clearing of history, cookies and cache.
The home page carries the disclaimer "Privacy reduces tracking but is not a security guarantee". This is consistent with the position taken across the Privoo products, including Privoo Desktop's own documentation: the browser reduces commercial tracking and does not confer anonymity.
Data
- History stored in Room, searchable and grouped by date.
- Bookmarks with search, and JSON import and export through the Storage Access Framework, so the data can be moved off the device by the user rather than only by the application.
- Download manager backed by a real in-app engine; see Implementation scope.
- Session and tab persistence across launches.
JSON export deserves note given the absence of synchronisation across the Privoo products: it is the mechanism by which bookmarks can be moved between devices at all.
Design
The application reproduces the desktop browser's visual language: a dark
#16181D canvas, a floating rounded toolbar, a pill-shaped address bar,
the ghost mascot home page, and soft glass-like surfaces.
- Material 3 with light, dark and system themes, implemented through a theme-aware palette exposed as a Compose
CompositionLocalrather than hard-coded colours. - AMOLED mode, for true-black displays.
- Selectable accent colour, mirroring Privoo Desktop's accent behaviour.
- Optional bottom toolbar, which on a phone is the reachable position.
- 60fps animations: toolbar press-scale, suggestion transitions, tab open and close, address focus.
- Home page with the logo and a shortcut grid.
Privacy Shield and widget
A dashboard reports trackers and advertisements blocked, both for the current session and cumulatively, persisted in DataStore. A home-screen widget built with Glance shows the blocked count alongside the local temperature and deep-links into the Privacy Shield when tapped.
The temperature is retrieved from the Open-Meteo API, which requires no key, using
the device's last known location. It requires coarse-location permission, requested
once at launch. Where permission or a recent location fix is unavailable, the widget
displays —° rather than a fabricated value, and it refreshes on the
system widget period of approximately 30 minutes.
Encrypted DNS
Android's WebView and its underlying network stack expose no public per-application API for DNS-over-HTTPS. An in-app DoH toggle would therefore not actually route WebView traffic, and would amount to a control that appears to do something while doing nothing.
Instead, Settings → Privacy → Secure DNS deep-links to Android's own Private DNS screen, which configures strict, hostname-pinned encrypted DNS for the entire device. This is the mechanism that genuinely works on the platform.
Privoo Desktop bundles Chromium and can configure the resolver directly, so its encrypted DNS is a browser setting operating in strict mode. On Android the equivalent is an operating-system setting that applies device-wide. See Privoo Desktop: Encrypted DNS.
Implementation scope
Several areas are implemented as working foundations rather than exhaustively, and are documented as such rather than being presented as complete:
| Area | Current state |
|---|---|
| Downloads | A real download engine streams over HTTP(S) to app storage, persists live progress to Room, and supports pause and resume via HTTP Range requests, cancellation, and genuine speed and ETA reporting. Transfers run on an app-scoped coroutine, so they last as long as the process; surviving process death would require a foreground service. |
| Tracker blocking | A curated hostname blocklist held as a single editable set, chosen for low memory use. It is not a full EasyList engine, unlike Privoo Desktop. |
| Tab reordering | Supported in the view model. The drag gesture in the tab switcher is not yet wired up. |
| Tab thumbnails | Modelled in state; capturing live WebView bitmaps into that state remains to be added. |
| Secure DNS | Deep-links to the operating system's Private DNS screen, for the platform reason described above. |
These are documented limits of an application that compiles and runs as a usable browser, rather than defects.
Comparison with Privoo Desktop
| Aspect | Privoo for Android | Privoo Desktop |
|---|---|---|
| Source | Closed source | MIT licensed, public |
| Distribution | APK via Proton Drive, linked in Discord | GitHub Releases |
| Updates | Manual only | Automatic |
| Engine | Android WebView | Chromium 148 via Electron |
| Built with | Kotlin, Jetpack Compose | JavaScript, HTML, CSS |
| Blocking | Hostname blocklist | EasyList, EasyPrivacy, uBlock Origin |
| Encrypted DNS | Deep-links to OS Private DNS | In-browser DoH, strict mode |
| Tor and .mariana | Not available | Available |
| DRM playback | System WebView behaviour | Widevine, VMP-signed |
| Extensions | Not supported | Partial third-party support |
Requirements and building
The application is closed source, so building from source is not available to the public. The project's own build requirements are recorded here for completeness:
| Tool | Version |
|---|---|
| Android Studio | Ladybug (2024.2) or newer |
| JDK | 17 |
| Android Gradle Plugin | 8.7.x |
| Gradle | 8.11.x |
| Minimum SDK | 29 (Android 10) |
| Target and compile SDK | 35 (Android 15) |