Skip to content

Privacy Features ​

Deep dive into the privacy protections built into Nothing Private Browser.


Overview ​

Nothing Private Browser has zero telemetry, zero session persistence, and zero black boxes. Every privacy feature is enabled by default β€” no configuration required.

FeatureStatusDescription
Zero telemetryβœ… EnabledNo analytics, no phoning home
Session wipingβœ… EnabledEverything deleted on close
Fingerprint spoofingβœ… EnabledChrome-identical fingerprint
WebRTC leak protectionβœ… EnabledReal IP never exposed
UA-CH spoofingβœ… EnabledModern fingerprinting blocked
Ad blockingπŸ“‹ PlannedNetwork-level filter lists
Tor routingπŸ“‹ PlannedOptional onion routing
VPN integrationπŸ“‹ PlannedImport .ovpn/WireGuard

Zero Telemetry ​

Nothing Private Browser sends zero data anywhere.

What's Not Collected ​

cpp
// NOTHING is collected:
// ❌ No usage metrics
// ❌ No crash reports
// ❌ No browsing history
// ❌ No search queries
// ❌ No device information
// ❌ No IP addresses
// ❌ No timestamps
// ❌ Nothing

No "Phone Home" Calls ​

cpp
// No calls to:
// β€’ google-analytics.com
// β€’ crashlytics.com
// β€’ sentry.io
// β€’ Any external servers

// The browser only connects to sites YOU visit

Comparison ​

BrowserTelemetryPhone Home
Nothing Private❌ None❌ None
Chromeβœ… Yesβœ… Yes
Firefox⚠️ Some⚠️ Some
Brave⚠️ Some⚠️ Some
Safari⚠️ Someβœ… Yes

Zero Session Persistence ​

Everything is wiped when you close the browser.

What Gets Wiped ​

ItemStatusOn Close
Cookiesβœ… DeletedImmediately
Cacheβœ… ClearedImmediately
localStorageβœ… EmptiedImmediately
sessionStorageβœ… EmptiedImmediately
Browsing historyβœ… RemovedImmediately
IndexedDBβœ… PurgedImmediately
Service workersβœ… UnregisteredImmediately
Site permissionsβœ… ResetImmediately

Code Implementation ​

cpp
void PrivateBrowser::closeEvent(QCloseEvent* event) {
    // Wipe everything
    m_profile->cookieStore()->deleteAllCookies();
    m_profile->clearHttpCache();
    m_profile->clearAllVisitedLinks();
    m_profile->clearStorage();
    
    // Delete storage files
    QString storagePath = m_profile->storagePath();
    if (QDir(storagePath).exists()) {
        QDir(storagePath).removeRecursively();
    }
    
    // Fresh profile next launch
    m_profile = new QWebEngineProfile("PrivateSession_" + QUuid::createUuid().toString());
}

What This Means ​

  • Close the browser = fresh start
  • No traces on disk
  • No way to recover previous session
  • Perfect for sensitive browsing

Fingerprint Spoofing ​

Nothing Private Browser randomizes browser fingerprints to prevent tracking.

Spoofed Properties ​

PropertyReal ValueSpoofed Value
User-AgentFirefox/Chrome versionChrome 124
PlatformLinux x86_64Win32
Hardware concurrency16 cores8 cores
Device memory32GB8GB
WebGL vendorNVIDIA/AMDIntel Inc.
WebGL rendererActual GPUIntel Iris
Canvas fingerprintUniqueNoised (xorshift)
Audio fingerprintUniqueNoised (Β±0.00000005)

Injection Timing ​

Spoofing happens at DocumentCreation β€” before any page JavaScript runs:

cpp
QWebEngineScript script;
script.setInjectionPoint(QWebEngineScript::DocumentCreation);  // Key!
script.setWorldId(QWebEngineScript::MainWorld);
script.setRunsOnSubFrames(true);

This means page scripts cannot detect the spoofing β€” it was "always there."

Per-Session Randomization ​

cpp
// New seeds every session
m_canvasSeed = QRandomGenerator::global()->generateDouble();
m_audioSeed = QRandomGenerator::global()->generateDouble();

// Different fingerprint every session
// Consistent within the same session

WebRTC Leak Protection ​

WebRTC can expose your real IP address even when using a VPN.

The Problem ​

javascript
// Any website can do this
const pc = new RTCPeerConnection({ iceServers: [{ urls: "stun:stun.l.google.com:19302" }] });
pc.createDataChannel("");
pc.createOffer().then(offer => pc.setLocalDescription(offer));

// Your real IP appears in ICE candidates
pc.onicecandidate = (event) => {
    console.log(event.candidate.candidate); // Real IP exposed!
};

The Solution ​

cpp
void WebRTCProtector::interceptRTCPeerConnection() {
    // Strip all STUN servers from ICE config
    QString script = R"(
        const OriginalRTCPeerConnection = window.RTCPeerConnection;
        window.RTCPeerConnection = function(config) {
            // Remove STUN servers
            if (config && config.iceServers) {
                config.iceServers = config.iceServers.filter(
                    server => !server.urls?.includes('stun:')
                );
            }
            return new OriginalRTCPeerConnection(config);
        };
    )";
    
    m_page->runJavaScript(script);
}

Result ​

ScenarioReal IP Leaks?
Without protectionβœ… Yes (exposed)
With protection❌ No (blocked)
With VPN + protection❌ No (VPN IP only)

UA-CH Spoofing ​

User-Agent Client Hints (UA-CH) are modern fingerprinting methods.

What UA-CH Reveals ​

javascript
// Sites can request high-entropy values
const hints = await navigator.userAgentData.getHighEntropyValues([
    "architecture",
    "model",
    "platform",
    "platformVersion",
    "uaFullVersion"
]);

// Without spoofing, reveals:
// β€’ CPU architecture (arm64/x86)
// β€’ Device model (MacBookPro18,1)
// β€’ Exact OS version
// β€’ Exact browser version

Spoofed Values ​

cpp
QString spoofedUA = R"(
    Object.defineProperty(navigator, 'userAgentData', {
        get: () => ({
            brands: [
                { brand: "Chromium", version: "124" },
                { brand: "Not A(Brand", version: "99" }
            ],
            mobile: false,
            platform: "Windows",
            getHighEntropyValues: async (hints) => ({
                architecture: "x86",
                model: "",
                platform: "Windows",
                platformVersion: "10.0",
                uaFullVersion: "124.0.6367.91"
            })
        })
    });
)";

DNS Leak Prevention ​

DNS leaks can reveal your browsing activity even with HTTPS.

Current Status ​

FeatureStatusVersion
DNS over HTTPS⚠️ Plannedv0.2.0
DNS leak blocking⚠️ Plannedv0.2.0
Custom DNS servers⚠️ Plannedv0.2.0

Workaround ​

Use a VPN or configure system DNS:

bash
# Linux - use Cloudflare DNS
echo "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf
echo "nameserver 1.0.0.1" | sudo tee -a /etc/resolv.conf

Ad Blocking (Planned for v0.2.0) ​

Network-level ad blocking using filter lists.

Filter List Support ​

ListStatus
EasyListπŸ“‹ Planned
EasyPrivacyπŸ“‹ Planned
Peter Lowe's listπŸ“‹ Planned
uBlock Origin filtersπŸ“‹ Planned

Implementation ​

cpp
class AdBlocker : public QWebEngineUrlRequestInterceptor {
    void interceptRequest(QWebEngineUrlRequestInfo &info) override {
        QUrl url = info.requestUrl();
        
        // Check against filter lists
        if (m_filterList->isBlocked(url.host(), url.path())) {
            info.block(true);
            return;
        }
        
        info.block(false);
    }
};

Tor Routing (Planned for v0.3.0) ​

Optional onion routing for complete anonymity.

How It Works ​

Your Computer β†’ Tor Network β†’ Destination
                    β”‚
                    β”œβ”€β”€ Node 1 (entry)
                    β”œβ”€β”€ Node 2 (middle)
                    └── Node 3 (exit) β†’ Website

Implementation ​

cpp
void enableTor() {
    // Route through Tor SOCKS proxy
    m_profile->setProxy(QNetworkProxy::Socks5Proxy, "127.0.0.1", 9050);
    
    // Disable WebRTC (already done)
    // Disable DNS leaks
    // Disable JavaScript if needed
}

One Toggle ​

cpp
// Settings toggle
connect(torToggle, &QCheckBox::toggled, [this](bool enabled) {
    if (enabled) {
        enableTor();
    } else {
        disableTor();
    }
});

VPN Integration (Planned for v0.3.0) ​

Import VPN configurations directly into the browser.

Supported Formats ​

FormatSupport
OpenVPN (.ovpn)πŸ“‹ Planned
WireGuard (.conf)πŸ“‹ Planned
ProtonVPNπŸ“‹ Planned

Import Flow ​

cpp
void importVPNConfig(const QString& filePath) {
    if (filePath.endsWith(".ovpn")) {
        importOpenVPN(filePath);
    } else if (filePath.endsWith(".conf")) {
        importWireGuard(filePath);
    }
    
    // Route browser traffic through VPN
    m_profile->setProxy(m_vpnProxy);
}

Privacy Settings (None) ​

There are no privacy settings to configure.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    SETTINGS                                 β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                             β”‚
β”‚   There is nothing to configure.                            β”‚
β”‚                                                             β”‚
β”‚   Privacy is already enabled.                               β”‚
β”‚   Fingerprinting is already blocked.                        β”‚
β”‚   WebRTC is already protected.                              β”‚
β”‚                                                             β”‚
β”‚   Close the browser when you're done.                       β”‚
β”‚   Everything is wiped automatically.                        β”‚
β”‚                                                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Privacy by default. No toggles. No confusion.


Privacy Audit Checklist ​

CheckStatusEvidence
No telemetryβœ… PassCode audit, network monitoring
No persistent storageβœ… PassStorage cleared on close
Fingerprint spoofingβœ… PassJA3 matches Chrome
WebRTC protectionβœ… PassSTUN servers stripped
UA-CH spoofingβœ… PassgetHighEntropyValues spoofed
DNS leaks⚠️ PartialVPN required
Ad blockingπŸ“‹ Plannedv0.2.0
Tor integrationπŸ“‹ Plannedv0.3.0

Testing Your Privacy ​

Test Your Browser ​

SiteWhat It Tests
browserleaks.comWebRTC, canvas, fingerprints
amiunique.orgBrowser fingerprint
ipleak.netIP and DNS leaks
deviceinfo.meDevice information

Manual Tests ​

javascript
// Check WebRTC leak
const pc = new RTCPeerConnection({ iceServers: [{ urls: "stun:stun.l.google.com:19302" }] });
pc.createDataChannel("");
pc.createOffer().then(offer => pc.setLocalDescription(offer));
pc.onicecandidate = (event) => {
    console.log(event.candidate?.candidate); // Should be empty or no IP
};

// Check fingerprint
console.log(navigator.userAgent);
console.log(navigator.plugins.length);
console.log(navigator.webdriver); // Should be undefined

Next Steps ​


Nothing Ecosystem Β· Ernest Tech House Β· Kenya Β· 2026

MIT Licensed | Built by Ernest Tech House Β· Kenya Β· 2026