Back to Knowledge Hub
Fingerprint

What Is Font Fingerprinting? Cross-Platform Text Consistency

What is font fingerprinting? Learn how font availability, fallback behavior, and text metrics expose platform traits and affect browser privacy.

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.

BotBrowser can keep font behavior aligned with a selected profile and lets teams compare representative text outcomes across hosts. It cannot guarantee anonymity or site acceptance, so this article treats font behavior as a measurable privacy and compatibility boundary rather than an identity verdict.

What Font Fingerprinting Measures

Font fingerprinting uses font availability, fallback behavior, and text metrics to learn how a browser renders text. A website does not need special permission to observe whether text lays out like Windows, macOS, Linux, or a mobile device. It reads ordinary rendering behavior and can combine it with canvas, WebGL, language, and screen signals.

  • Font availability reveals broad operating system and language-pack traits.
  • Fallback behavior shows which face the browser picks when a requested family or glyph is missing.
  • Text metrics show how the browser measures glyph width, line height, and layout.
  • Canvas text can reflect the same font behavior through rendered pixels.

Diagram: Linux, macOS, and Windows hosts feed one profile font bundle, which produces the same text layout in every environment.

A page can observe fonts in three ordinary ways. It can ask for text in a named family and see whether that family or a substitute was used. It can rely on the fallback rules in CSS Fonts Level 4, which describe how a browser walks a font-family list and chooses another face for characters that the first choice cannot draw. And it can call measurement methods such as measureText, which reports widths and bounding boxes for a string. The same string measures differently when a different face is selected.

A page does not need a direct list of installed fonts for this to matter. Box widths, line breaks, and scroll heights are all derived from the faces that were used, so layout alone carries platform information. Canvas text adds a second view of the same behavior, because the pixels that come out of a text drawing call depend on the selected face and the rasterizer.

Fonts also interact with language and region. When a page declares a language, or the browser reports preferred languages, the fallback order for scripts such as Chinese, Japanese, and Korean follows those hints. A profile that reports one language while drawing text with the face choices of another produces a mismatch that a careful observer can notice without reading a single font name. Treat the font inventory and the language settings of a profile as one decision, not two.

Why Consistency Matters More Than Any Single Value

For privacy teams, the risk is rarely one isolated value. The risk is inconsistency. A browser profile may claim to be a Windows desktop while the host machine exposes Linux-style text behavior. A mobile identity may carry desktop font traits. A profile may stay stable in one environment and drift in another.

Three kinds of agreement matter:

  • Platform identity: Windows, macOS, Linux, and mobile-target profiles should not expose host-specific font traits.
  • Session continuity: the same profile should produce stable text behavior across launches and machines.
  • Cross-signal consistency: font behavior should agree with the profile's browser brand, device class, language, and rendering model.

Strong font handling is not about blocking layout. Pages still need text to render correctly, and users still need readable controls. The goal is that text behavior comes from the selected profile instead of from whatever the host happens to have installed, while ordinary web compatibility stays intact. Canvas text is the closest neighbor of this topic, and canvas consistency covers how the same principle applies to drawn pixels.

This matters most for server deployments. Many production fleets run on Linux because it is efficient and easy to scale, while the browser identity a team needs may represent a desktop or mobile environment. Fonts are one of the easiest places for the host infrastructure to become visible, so they deserve an explicit check.

The same comparison applies to headless and headful runs, but identical rendering is not guaranteed across hosts, display services, graphics backends, or font stacks. Use the same profile and flags as controlled inputs, record the host and display policy, and compare the resulting metrics instead of assuming that scheduled headless screenshots will match a headful session. If they differ, check the font mode and rendering environment before treating the change as a product regression.

Keeping Text Consistent Across Hosts

Profile Mode And Built-In Font Bundles

The BotBrowser documentation describes a profile-driven approach. Each profile includes the standard fonts for its target platform, and font availability and enumeration results follow what the target operating system would report. A Windows profile running on a Linux host should behave like the selected Windows profile, not like the Linux server underneath it. The same principle applies to macOS and Linux targets.

Profile-backed font handling also covers local font sources, loading by name, and multilingual fallback. Windows-target profiles keep their font renderer preferences with the active browser context, including per-context sessions that run on another host platform. Text shaping for a Windows profile on a Linux host preserves the profile's spacing and kerning in the final layout, so documents and mixed-script pages do not fall through to host fonts.

When Expand Or Real Is Intentional

Font behavior is controlled with the --bot-fonts option, which has three modes:

  • profile is the default and uses the fonts embedded in the profile.
  • expand uses the profile fonts and adds host font fallback.
  • real uses the real system fonts and offers no font protection.

Keep --bot-fonts=profile when cross-host consistency matters, because the profile inventory and fallback policy then stay authoritative. Use expand or real only when the workflow intentionally permits host variation and that variation is part of the test plan. If a font list in a test shows host fonts, check the mode before looking anywhere else.

CJK And Mixed-Script Pages

CJK text depends heavily on language packs, fallback order, and rendering behavior, so it is the quickest way to notice a host leak. Missing glyphs usually mean the available inventory lacks a suitable face, and the BotBrowser documentation notes that Windows and macOS profiles include CJK support by default. For the details of Chinese, Japanese, and Korean text, read CJK font rendering. For the wider question of keeping one profile stable across operating systems, see cross-platform browser profiles.

Build A Representative Text Set

A useful text set comes from the product being tested. Start with pages that customers use every day: sign-in, account settings, search results, tables, editors, checkout, printable documents, and support content. Include the states that change layout, such as validation messages, disabled controls, expanded menus, and empty results. A single sample paragraph cannot represent the typography of an application.

Keep the set small enough to run for every release. Ten carefully chosen pages are usually more useful than hundreds of screenshots that nobody reviews. Each page should have an owner, a reason for inclusion, and a stable checkpoint. The checkpoint can be a screenshot, a document export, or a recorded functional outcome such as a button label remaining visible.

Language coverage should follow real users. A product that supports English, Spanish, French, Russian, and Chinese needs representative text in each supported language. Add Japanese, Korean, Arabic, Hebrew, or other scripts when they are part of the product. Include mixed-language records where names, addresses, or catalog entries commonly use more than one script.

Choose content that exercises normal typography without becoming artificial. Long customer names, narrow table columns, multiline labels, dates, currency, and document previews are good candidates because they expose practical layout regressions. Pages created only to enumerate environment details do not show whether the product remains usable, so leave them out.

Record the expected viewport and zoom level for every visual checkpoint, because a line wrap caused by a different viewport is not a font regression. The release record should also identify the profile family, BotBrowser version, base image, and application revision. Those details let another engineer reproduce the same user-facing review without collecting unnecessary machine data.

Pages that load their own web fonts need one more rule: capture a checkpoint only after the fonts have finished loading. A swap from a temporary face to the final face changes widths and line breaks, and a screenshot taken in the middle of that swap looks like a regression when it is only a timing difference. Font loading and layout stability explains how to tell the two apart and how to wait for settled text before comparing results.

Text review should include states that appear after a user acts. Open menus, validation messages, autocomplete results, modal dialogs, and loading states often have tighter layout limits than the initial page. Run keyboard navigation through the same states, because focus indicators, helper text, and error summaries can use different typography from ordinary content.

Include printable pages, exported documents, and accessibility views when the product depends on them. Confirm that page breaks, headings, form labels, and reading order remain usable. Record the application outcome together with the visual result so a reviewer can tell a harmless appearance change from lost information.

Validate Across Hosts And Approve Results

Cross-Host Comparison

Cross-host review answers a simple question: does the same approved profile preserve the same usable text experience on each supported worker class? Run the representative set on the hosts used in production and compare the results against the approved baseline.

  • Run the same profile on two different host operating systems.
  • Compare a representative page that includes normal text, CJK text if relevant, and canvas text if that is part of the workflow.
  • Confirm that the observed behavior stays aligned with the profile target instead of the host machine.
  • Keep the result as part of the release or profile validation package.

Small pixel differences do not automatically mean a release is unsuitable. The acceptance rule should come from the product. A screenshot service may require a tighter visual baseline than a workflow that only reads and submits forms. Define tolerances before the review so release decisions are consistent and do not depend on who happens to inspect the result.

Treat missing characters, unreadable controls, unexpected symbol substitution, and text that overlaps nearby content as blocking issues. A changed line break may be acceptable when no information is lost and the page remains stable. Document the decision with the page owner so the same change is not debated again during the next release.

Screenshots are useful evidence, but they are not the only evidence. Text selection, form entry, copy and paste, PDF output, and accessibility labels can reveal customer-facing problems that a static image misses. Name an owner for each representative page and profile family. The owner decides whether a visible difference is expected, updates the baseline when product typography changes, and records the release decision.

Release Records And Updates

The browser release, profile package, and server image form one deployable unit. Keep their versions together in the deployment record. A profile approved against one release should not be silently reused after a major browser or image change. Re-run the representative text set and record the new baseline.

Update one layer at a time when possible. First validate the new BotBrowser release with the existing approved profile and image. Then validate the intended profile update. Finally validate any base-image or language-package change. This order narrows the source of a visual change and makes rollback decisions straightforward. Adding or removing a language package, or updating a desktop library, can change ordinary text, so route a new image through the same checks before it enters the worker pool.

A concise release record can contain one row per page: the result, the expected result, the browser and profile versions, the host class, and the reviewer decision. Note whether the page passed, required an approved baseline update, or needs investigation. Link the row to the screenshot or document output and to the application owner. Avoid storing unrelated account data or full browsing histories, and use dedicated test accounts and synthetic documents where practical.

When a baseline changes intentionally, keep the previous result long enough to explain the transition, with a short reason such as a product typography update or a profile-family update. Do not mix unrelated profile families in one baseline, because desktop, mobile, and tablet layouts have different expectations. Retention should follow the organization's normal quality and privacy policy, and personal information should be redacted before a screenshot joins a long-lived record.

Responding To Visible Drift

When text changes unexpectedly, pause broad rollout and reproduce the affected page with the recorded profile, browser version, image, viewport, and application revision. Confirm the change on a clean worker before changing configuration. This separates a persistent release issue from a damaged cache or one unhealthy host.

Next, compare the last approved combination with the candidate combination, changing only one component between runs. If the difference follows the base image, review recent package changes. If it follows the profile, return to the approved profile while the owner reviews the update. If it follows the application, route the result to the page owner.

If a review also uses the optional ClientRects and text rects noise settings, which are disabled by default, fix the noise seed for the comparison. Without a fixed seed, measurement values vary from session to session, and a reviewer cannot tell intended variation from a real change. With a fixed seed, repeated sessions give the same measurement output and the comparison stays meaningful.

Record user impact rather than only visual difference. Missing glyphs, clipped labels, unusable controls, and changed document pagination deserve immediate attention, while a harmless antialiasing variation may only need a baseline note. After a correction, repeat the complete representative set for the affected profile family, because a fix for one page can change another language or document layout. Roll out in stages, starting with a small worker group, and promote the release only after the agreed checkpoints pass on every worker class that will receive it.

What BotBrowser Font Handling Covers And What It Does Not

BotBrowser can keep font behavior aligned with the selected profile through the --bot-fonts=profile mode and the built-in per-platform font bundles, so a Windows-target profile on a Linux host reports the profile's font inventory and metrics instead of the host's. That gives teams a stable reference for the checks above. BotBrowser does not make font consistency a guarantee of anonymity or site acceptance, it cannot replace canvas, language, and screen consistency or a team's own cross-host validation, and --bot-fonts=real or expand intentionally reintroduces host variation.

Font behavior is one signal among several, and a profile is only as consistent as its weakest surface. Before changing a profile, a font mode, or a host image, run the representative set again and compare the visible result with the profile target. A change that looks small in one language can be large in another, so review every language the product supports before approving the update. The font documentation lists the modes and troubleshooting steps, and the CJK documentation covers Chinese, Japanese, and Korean rendering in more detail.

Public Sources

#Fonts#Fingerprinting#Text Metrics#Privacy#Browser Signals#Profile Consistency

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.