Back to Blog
Platform

Run Windows Browser Profiles on macOS and Linux

How to present a complete Windows browser identity while running on macOS or Linux with all platform signals controlled at the engine level.

Introduction

Windows dominates the global desktop operating system market. According to StatCounter, Windows accounts for roughly 72% of desktop browser traffic worldwide, with even higher shares in regions like North America, Europe, and parts of Asia. For production deployments running on Linux servers or development work happening on macOS, presenting a Windows browser identity is often the most natural and statistically appropriate choice.

BotBrowser profiles captured from real Windows installations contain the complete set of Windows-specific signals: platform strings, font environments, rendering characteristics, screen metrics, and more. When loaded on a macOS or Linux host, every signal aligns with Windows. The host OS contributes nothing to the browser's observable identity.

Privacy Impact: Why Windows Profiles on Non-Windows Hosts

The statistical argument is straightforward. If your browser automation generates traffic that should look like ordinary desktop browsing, Windows is the most common desktop platform by a wide margin. Running Linux browser profiles from Linux servers creates a statistical anomaly: Linux desktop usage is around 4% globally, and much of that comes from developer workstations, not from the general browsing patterns that most automation represents.

For privacy researchers, the ability to present a Windows identity from a non-Windows host enables controlled experiments. You can study how websites adapt their behavior for Windows users, test platform-specific content delivery, and analyze tracking systems that use platform signals, all without maintaining a Windows machine.

For multi-account management, Windows profiles provide the most inconspicuous baseline for Western markets. Combined with the right proxy, timezone, and locale settings, a Windows Chrome profile represents the single most common browser configuration on the internet.

Technical Background

Windows-Specific Browser Signals

A real Windows browser session exposes its platform through numerous signals:

Navigator and User-Agent: navigator.platform returns "Win32" (even on 64-bit systems, for legacy compatibility). The User-Agent string contains "Windows NT 10.0" for Windows 10/11. navigator.userAgentData.platform returns "Windows" with the platform version available through getHighEntropyValues().

Client Hints: The Sec-CH-UA-Platform HTTP header reports "Windows" on every request. Sec-CH-UA-Platform-Version provides the specific Windows version (e.g., "15.0.0" for Windows 11, "10.0.0" for Windows 10).

Font environment: Windows ships with hundreds of fonts including Segoe UI (the system font), Calibri, Cambria, Consolas, Arial, Times New Roman, Verdana, Tahoma, and many others. Font enumeration through CSS or Canvas reveals this specific set.

Rendering characteristics: Windows uses DirectWrite for text rendering, which produces distinctive anti-aliasing patterns compared to macOS Core Text or Linux FreeType. These differences are visible in Canvas text rendering and can be used to identify the platform.

Screen metrics: Common Windows screen resolutions (1920x1080, 1366x768, 2560x1440) and devicePixelRatio values (typically 1.0 or 1.25) differ from macOS (where Retina displays commonly have DPR of 2.0) and Linux (which varies widely).

Window chrome: The dimensions of browser window decorations (title bar height, scrollbar width, window border) differ between operating systems. The outerWidth - innerWidth and outerHeight - innerHeight calculations reveal these dimensions.

Why Simple Spoofing Fails

Changing the User-Agent string to report Windows does not change the font environment, rendering output, screen metrics, window chrome dimensions, or Client Hints. A browser that claims to be Windows but renders text with FreeType characteristics and reports Linux fonts presents contradictory signals. These inconsistencies are straightforward to identify through cross-signal analysis.

Common Approaches and Their Limitations

User-Agent Overrides

Frameworks like Playwright and Puppeteer allow setting custom User-Agent strings. This changes the HTTP header and navigator.userAgent but leaves all other signals unchanged. navigator.platform, font lists, rendering output, and Client Hints all continue to reflect the actual host OS.

Windows VMs on Linux

Running Windows inside a virtual machine on a Linux server provides genuine Windows signals, but the resource cost is high. Each VM needs 4-8 GB of RAM, dedicated CPU cores, and a Windows license. At scale, this approach is prohibitively expensive compared to profile-based emulation.

Wine or Compatibility Layers

Running Windows Chrome through Wine on Linux produces a mixed signal environment. Some signals reflect Windows, others reflect the underlying Linux system. The result is a set of inconsistencies that is worse than running either platform natively.

DevTools Protocol Overrides

Chrome DevTools Protocol allows overriding the User-Agent and some platform properties. However, these overrides are applied after browser initialization and do not affect the rendering pipeline, font system, or early HTTP headers like Client Hints on the initial navigation.

BotBrowser's Approach

BotBrowser profiles captured from Windows systems contain every Windows-specific signal in a single package. Loading a Windows profile on any host OS applies all of these signals at the engine level during browser initialization.

What a Windows Profile Controls

When you load a Windows 11 Chrome profile on a Linux server:

  • navigator.platform returns "Win32"
  • navigator.userAgent contains "Windows NT 10.0; Win64; x64"
  • Sec-CH-UA-Platform header reports "Windows"
  • Sec-CH-UA-Platform-Version reports the captured Windows version
  • Font queries return the Windows font set (Segoe UI, Calibri, etc.)
  • Canvas text rendering matches DirectWrite characteristics
  • WebGL renderer strings match the source GPU
  • Screen metrics match common Windows configurations
  • Window chrome dimensions match Windows Chromium behavior

No Configuration Required

Cross-platform support is not a separate feature that needs to be enabled. Every profile is inherently cross-platform. You load a Windows profile the same way on Linux, macOS, or Windows. The --bot-profile flag is all that is needed.

Pairing with Edge or Brave

Windows users commonly use Microsoft Edge or Google Chrome. BotBrowser supports brand switching to present as Edge:

chrome --bot-profile="/profiles/win11-edge.enc" \
       --bot-config-browser-brand=edge

This updates all brand-specific signals (User-Agent brands, Client Hints brand tokens, feature flags) to match Edge on Windows.

Configuration and Usage

Basic Windows Profile on Linux

# On a Linux server
DISPLAY=:10.0 chrome \
  --bot-profile="/profiles/win11-chrome-130.enc" \
  --user-data-dir="$(mktemp -d)"

Windows Profile with US Identity

DISPLAY=:10.0 chrome \
  --bot-profile="/profiles/win11-chrome-130.enc" \
  --proxy-server=socks5://user:pass@us-proxy:1080 \
  --bot-config-timezone=America/New_York \
  --bot-config-locale=en-US \
  --bot-config-languages=en-US,en

Puppeteer Example

const puppeteer = require('puppeteer-core');

(async () => {
  const browser = await puppeteer.launch({
    executablePath: '/path/to/botbrowser/chrome',
    args: [
      '--bot-profile=/profiles/win11-chrome-130.enc',
      '--bot-config-timezone=America/Chicago',
      '--bot-config-locale=en-US',
      '--bot-config-languages=en-US,en',
    ],
    headless: true,
    defaultViewport: null,
  });

  const page = await browser.newPage();
  await page.goto('https://example.com');

  const platform = await page.evaluate(() => ({
    platform: navigator.platform,
    ua: navigator.userAgent,
  }));
  console.log(platform);
  await browser.close();
})();

Edge on Linux with EU Proxy

DISPLAY=:10.0 chrome \
  --bot-profile="/profiles/win11-edge.enc" \
  --bot-config-browser-brand=edge \
  --proxy-server=socks5://user:pass@de-proxy:1080 \
  --bot-config-timezone=Europe/Berlin \
  --bot-config-locale=de-DE \
  --bot-config-languages=de-DE,de,en

Verification

Verify that the Windows profile is applied correctly by checking multiple signal categories:

const page = await context.newPage();
await page.goto('https://example.com');

const verification = await page.evaluate(async () => {
  const result = {
    platform: navigator.platform,
    userAgent: navigator.userAgent,
  };

  if (navigator.userAgentData) {
    result.uaPlatform = navigator.userAgentData.platform;
    const highEntropy = await navigator.userAgentData.getHighEntropyValues([
      'platform', 'platformVersion'
    ]);
    result.platformVersion = highEntropy.platformVersion;
  }

  return result;
});

console.log('Windows profile verification:', verification);
// platform: "Win32"
// userAgent: "...Windows NT 10.0; Win64; x64..."
// uaPlatform: "Windows"
Windows Profile Signal Coverage navigator.platform = "Win32" UA: Windows NT 10.0 Fonts: Segoe UI, Calibri... Canvas: DirectWrite CH: Sec-CH-UA-Platform Screen: 1920x1080 @ 1.0 WebGL: source GPU strings

Best Practices

  • Choose Windows 10 or 11 profiles. These are the current dominant Windows versions. Windows 7 profiles are outdated for modern Chrome versions.
  • Match proxy location to the profile. Windows dominates desktop traffic in North America, Europe, and many parts of Asia. Use Windows profiles with proxies in these regions.
  • Set DISPLAY on Linux servers. Always set DISPLAY=:10.0 when running on Linux, even in headless mode.
  • Use defaultViewport: null in Playwright and Puppeteer to let the profile control viewport dimensions rather than the framework.
  • Combine with locale and timezone. A Windows profile without matching locale settings is incomplete. Set --bot-config-timezone, --bot-config-locale, and --bot-config-languages to match the proxy location.
  • Consider Edge for variety. Windows + Edge is a common combination. Using --bot-config-browser-brand=edge with a Windows profile diversifies your browser identity pool.

Frequently Asked Questions

Does the Linux host leak through anywhere when running a Windows profile?

No. BotBrowser controls all platform-dependent signals at the engine level. No Linux-specific information is exposed to websites or JavaScript when a Windows profile is loaded.

Can I run Windows 11 profiles specifically?

Yes. Windows 11 profiles report the appropriate platform version in Client Hints. The distinction between Windows 10 and 11 is primarily in the Sec-CH-UA-Platform-Version value, which is captured from the source system.

Do I need Windows fonts installed on my Linux server?

No. BotBrowser profiles contain the font environment from the source system. Font availability queries return the Windows font set regardless of what fonts are installed on the host.

How does screen resolution work with Windows profiles?

The profile carries screen metrics from the source system. Common Windows resolutions like 1920x1080 and 1366x768 are represented in the profile. The host screen resolution is not exposed.

Can I use the same profile file on different host operating systems?

Yes. The same .enc profile file works identically on Linux, macOS, and Windows hosts. The profile determines the browser identity, not the host OS.

What about Windows-specific APIs like WMI or DirectX?

Web browsers expose a limited set of platform APIs through standard web APIs. BotBrowser controls all web-accessible platform signals. System-level APIs like WMI are not accessible from web content.

Is there a performance difference running Windows profiles on Linux?

No. The profile controls what signals the browser reports. The actual computation still runs on the host hardware at native speed.

Summary

Running Windows browser profiles on macOS and Linux hosts is a core BotBrowser capability that enables production deployments on cost-effective Linux infrastructure while presenting the most common desktop platform identity. All Windows-specific signals are controlled at the engine level, with no configuration beyond the profile flag.

For related topics, see Cross-Platform Browser Profiles for the broader cross-platform overview, Android Emulation for mobile profiles, and Browser Brand Switching for combining platform and brand identities.

#windows#macos#linux#cross-platform#profiles