Back to Knowledge Hub
Platform

Run a Windows Browser Identity on macOS or Linux

Present a consistent Windows browser profile on macOS or Linux, while validating the signals that remain owned by your host, network, and application.

BotBrowser Team

Documentation

Prefer the maintained product doc?

This article has a matching page in the docs center. Use the docs for the canonical setup flow, current flags, and long-term reference.

Introduction

Windows is a common desktop target, but market-share estimates vary by date, region, and measurement method. For production deployments on Linux or development on macOS, a Windows profile is useful when the application test explicitly covers Windows browser behavior.

BotBrowser profiles captured from real Windows installations contain documented browser-visible platform values. When loaded on macOS or Linux, those values are profile inputs that must be measured in the actual session; host, display, graphics, network, and application conditions can still affect observations.

Privacy Impact: Why Windows Profiles on Non-Windows Hosts

The testing argument is straightforward: choose the profile that matches the documented platform behavior your application must support. Do not select a profile to make traffic look ordinary or to infer anything about a visitor. A Linux host can run a Windows-profile test when the journey is authorized and the host, network, and application boundaries are recorded.

For compatibility researchers, a non-Windows host can support controlled, authorized experiments. You can study platform-specific content delivery and application behavior without maintaining a Windows machine, while recording the host and session limits.

For localization or compatibility work, combine the profile with an intentionally selected proxy, timezone, and locale, then verify each input independently. Those settings describe a test scenario; they do not establish regional identity, concealment, or universal browser compatibility.

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: Text rendering can vary with browser build, host graphics, fonts, and display configuration. A profile may provide documented rendering-related inputs, but Canvas observations must be measured on each supported host and must not be treated as a guaranteed platform identifier.

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 User-Agent Changes Alone Fall Short

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 documented Windows-specific browser values in a single package. Loading a Windows profile applies those profile values during browser startup; it does not turn the host into Windows.

What a Windows Profile Controls

When you load a Windows Chrome profile on a Linux server, verify the following observations in that session:

  • 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 can be compared with the captured profile record, subject to host and build conditions
  • Canvas output must be measured rather than assumed to match a source renderer
  • WebGL renderer strings remain dependent on the host graphics path unless documented otherwise
  • Screen metrics reflect the session's viewport and display policy
  • Window dimensions must be checked on the selected framework and host

No Configuration Required

Loading a profile on another host does not by itself establish cross-platform equivalence. Use --bot-profile as one launch input, then verify the session, display, framework, network, and application conditions on each supported host.

Pairing with Edge or Brave

Windows users commonly use Microsoft Edge or Google Chrome. BotBrowser can expose documented brand, locale, and timezone values only in authorized contexts covered by the applicable profile and feature entitlements; verify the selected values in the session. For a supported Edge test:

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

Documented brand-visible values may change, including User-Agent brands, Client Hints tokens, and feature behavior; verify them in the actual session without making a universal claim.

Configuration and Usage

Basic Windows Profile on Linux

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

Windows Profile with US Identity

DISPLAY=:88 chrome \
  --bot-profile="profiles/win11-chrome-130.enc" \
  --proxy-server=socks5://user:pass@us-proxy:1080 \
  --bot-timezone=America/New_York \
  --bot-locale=en-US \
  --bot-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-timezone=America/Chicago',
      '--bot-locale=en-US',
      '--bot-languages=en-US,en',
    ],
    headless: true,
    defaultViewport: null,
  });

  console.log('Open an authorized test page with these launch options.');
  await browser.close();
})();

Edge on Linux with EU Proxy

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

Verification

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

const verification = {
  platform: 'Win32',
  userAgent: '...Windows NT 10.0; Win64; x64...',
  uaPlatform: 'Windows',
  platformVersion: '15.0.0',
};
console.log('Compare these expected values with the same authorized session.');

A Windows browser profile connecting macOS and Linux hosts to one consistent browser identity

Operational checklist

Start by naming the execution host and the browser profile separately. Record the host operating system, browser build, profile identifier, locale, timezone, proxy endpoint, viewport policy, and test date with every verification result. This makes a later mismatch diagnosable instead of turning it into a vague claim that the profile did not work.

Treat the profile as an input to a controlled browser context, not as a replacement for the surrounding deployment. Use a fresh user-data directory for an isolated run, keep credentials and synthetic records scoped to that run, and close the context when the workflow ends. A profile can provide browser-visible starting values, while cookies, storage, permissions, network routes, and application data still follow the lifecycle rules of the context and target service.

Check the network path before comparing platform signals. Confirm DNS behavior, proxy authentication, TLS termination, geolocation assumptions, and the service response. Do not infer that a matching Sec-CH-UA-Platform value proves that the proxy, IP reputation, or upstream service is also Windows-based.

Check locale and timezone as independent inputs. Verify the language list, number and date formatting, timezone offset, and the application locale selector. A consistent test records these values explicitly and treats an intentional mismatch as a test case rather than silently blending two identities.

Check viewport and display policy on every host type. On Linux configure the display service required by your deployment; on macOS account for Retina scaling and window management. Compare CSS viewport dimensions and device-pixel ratio from the session, then separate those observations from the profile platform values.

Use a small verification checklist instead of one broad assertion. Confirm the platform string, User-Agent family, requested Client Hints, selected font behavior, screen metrics, and application-visible locale. Store the observed values with the profile and browser versions. A passing item is evidence from that session only, not a compatibility promise for every host or site.

Plan lifecycle and cleanup explicitly. Create a new context for each authorized account or synthetic scenario, avoid sharing mutable storage between parallel workers, and retain the first workflow error if cleanup also fails. Delete only artifacts owned by the run, and do not describe context closure as deletion of server records.

For deployment, pin the profile and browser versions that your test matrix covers, then rerun the checklist after upgrades. Compare macOS and Linux hosts while documenting expected differences such as GPU availability, file paths, display services, and network controls. This gives operators a useful regression signal without claiming universal parity.

BotBrowser is a fit when you need repeatable, authorized browser-visible platform values in controlled contexts and can validate the rest of the journey yourself. It is not a Windows VM, proxy provider, font installer, graphics hardware replacement, or guarantee that every framework and application behaves identically. Keep that boundary in the runbook and link the identity documentation whenever results are shared. Keep failures actionable by assigning each observation to an owner and by recording whether it is documented profile behavior or a deployment observation. Do not put real customer identifiers or secrets in screenshots and logs; a synthetic fixture is enough.

The same discipline applies when switching between Chrome and Edge branding. Brand tokens, feature availability, and user-facing behavior can change with the browser build, so verify the selected brand in the session and keep profile, browser, and brand choices together in run metadata. Brand switching is not proof that an application supports every browser version or host configuration. Keep failures actionable by assigning each observation to an owner: profile, platform, network, or application. Document expected variation before a cross-host comparison, including virtual displays on Linux and Retina scaling on macOS. When a profile is retired, remove only authorized local artifacts, revoke test credentials through the normal application process, and retain a minimal result record. The profile file is not a Windows license or a backup of the source machine. Keep failures actionable by assigning each observation to an owner. The profile owner can confirm captured values and supported browser versions. The platform owner can inspect display, fonts, GPU, and filesystem conditions. The network owner can inspect proxy, DNS, and regional routing. The application owner can inspect permissions, feature flags, server sessions, and business assertions. This division prevents a browser-visible result from being treated as evidence about a system that the profile does not control.

Document expected variation before running a cross-host comparison. A Linux CI worker may use a virtual display, while a macOS laptop may use Retina scaling; those are deployment facts, not necessarily profile defects. Record the acceptable range for viewport and timing, then compare the browser-visible platform values separately. This gives reviewers enough context to reproduce a result without requiring access to private customer data. Keep the record concise, deterministic, and tied to an owned test route so that operators can repeat it after a browser update without exposing personal information.

When the profile is no longer needed, retire it according to your organization’s retention policy. Remove only authorized local artifacts, revoke test credentials through the application’s normal process, and retain a minimal result record for audit. A profile file does not represent a Windows license or a complete copy of the source machine, so it should not be treated as a backup of either.

Best Practices

  • Choose current Windows profiles. Use a profile and browser combination covered by your support matrix; legacy profiles may be outdated for current Chrome versions.
  • Choose proxy and locale for the test case. Record the intended region and timezone, then verify the network response separately from the profile values.
  • Use the project display only when needed. New headless runs do not need DISPLAY; headed or legacy headless=old runs using Xvfb should use the project display DISPLAY=:88.
  • 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-timezone, --bot-locale, and --bot-languages to match the proxy location.
  • Consider Edge for coverage. Windows + Edge is a common compatibility case. Use --bot-browser-brand=edge when the application test explicitly includes Edge, then verify its brand and feature behavior in the session.

Frequently Asked Questions

Verification notes

BotBrowser profiles can configure documented browser-visible platform values, but they do not turn Linux into a Windows operating system. Verify the signals relevant to your application in the same browser session; host, network, framework, and application behavior remain separate factors. Record the result as a bounded observation, include the profile and browser versions, and repeat it after upgrades rather than presenting one successful check as universal compatibility. Keep the evidence tied to an owned test route and a synthetic account fixture.

Review the evidence with the team responsible for the host and application before changing profile settings.

Can I run current Windows profiles specifically?

Yes. Current Windows profiles report the appropriate platform version in Client Hints. The version distinction is primarily in the Sec-CH-UA-Platform-Version value, which is captured from the source system. Compare that value with the profile record and do not infer host operating-system ownership from it.

Do I need Windows fonts installed on my Linux server?

Compare font availability with the captured profile record in the actual session. Host-installed fonts, browser build, permissions, and rendering path can affect the result, so do not assume a fixed font set without checking the host conditions.

How does screen resolution work with Windows profiles?

The profile may provide expected screen metrics, but viewport, display scaling, framework settings, and host hardware must be measured in the actual session. Do not infer that the host screen is hidden or that a particular resolution is guaranteed.

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

The same .enc profile can be loaded on Linux, macOS, and Windows hosts, but observed output must be verified per host and browser build. The profile supplies browser-visible inputs; it does not determine every host condition.

What about Windows-specific APIs like WMI or DirectX?

Web browsers expose a limited set of platform APIs through standard web APIs. BotBrowser documents profile values for supported browser-visible signals, while system-level APIs like WMI are not accessible from web content and host-dependent behavior remains outside the profile.

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

BotBrowser supports documented browser-visible platform values in controlled contexts for authorized cross-platform testing, but it does not provide a Windows operating system, guarantee identical output across hosts, or replace validation of network, locale, fonts, graphics, and application behavior. See BotBrowser identity documentation for the documented context boundary.

The practical boundary is simple: the profile supplies browser-visible starting values, while your team still owns the proxy, DNS path, permissions, viewport policy, framework lifecycle, and application assertions. Treat each verification as evidence from one session, record the host and profile identifiers, and rerun the same checklist after a profile or browser upgrade.

For related topics, see Cross-Platform Browser Profiles, Android Emulation, and Browser Brand Switching. For browser platform behavior, consult MDN User-Agent Client Hints.

Sources

#Windows#Macos#Linux#Cross-Platform#Profiles#Browser Identity#Fingerprint Protection#Platform Emulation

Take BotBrowser from research to production

The guides cover the model first, then move into cross-platform validation, isolated contexts, and scale-ready browser deployment.