Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

If Devanagari text is blank, shown as boxes, or shaped incorrectly in a Puppeteer screenshot on Linux, make sure a Devanagari-capable font is installed and discoverable in the exact environment running Chromium, then launch a fresh browser and test again. Do not assume the browser has a particular Linux font mapping: Chromium documented a Devanagari default-font change on March 4, 2026, but that change does not establish identical behavior in every packaged or downstream build.

Why Devanagari goes missing in a Puppeteer screenshot

Puppeteer asks Chromium to render the page and capture it. The fonts available to the Linux runtime running Chromium therefore affect which characters it can draw. A font installed on your laptop or on a Docker build host will not help if the screenshot is produced in a different container or serverless runtime.

There is also a browser-version factor. In a Chromium source change dated March 4, 2026, the project said: “Previously, Chromium had no configured default fonts for Devanagari, causing it to fall back to generic system font resolution.” The change maps standard and sans-serif text to Noto Sans Devanagari, serif text to Noto Serif Devanagari, and fixed-width text to Noto Sans Mono. This is evidence of that source change, not a guarantee that every Chromium build you run contains it. Read the Chromium change.

For background on Puppeteer’s browser selection and Linux environment, see the installation guide, Linux and Docker troubleshooting, and system requirements.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Diagnose the runtime that actually takes the screenshot

  1. Identify the deployed environment. Record the Puppeteer version, Linux distribution and release, whether the job runs in Docker, CI, serverless, or directly on a host, and the actual Chrome or Chromium executable and version. Puppeteer downloads a compatible Chrome for Testing by default, but configuration can change which browser is selected.
  2. Check fonts from inside that environment. Run font checks in the same container or runtime that launches Chromium, not only on your workstation or image-build host. For example, if fontconfig tools are available, fc-match 'Noto Sans Devanagari' can show which font is selected for that family, while fc-list can list fonts visible to fontconfig. A matching font file must be discoverable there for Chromium to use it.
  3. Check the requested font style. The Chromium change distinguishes sans-serif, serif, and fixed-width defaults. A page requesting a serif or monospace family may not use the same Devanagari font as a sans-serif page. Try an explicit family such as Noto Sans Devanagari, sans-serif in a diagnostic page.
  4. Separate font failures from launch failures. If Chromium cannot start because a shared library or other browser dependency is missing, that is a launch problem, not a missing-glyph problem. Puppeteer’s Linux troubleshooting guidance covers browser dependencies separately from font availability.

Install or expose a Devanagari font in Linux

Install a Devanagari-capable font, such as Noto Sans Devanagari, in the runtime image or host that runs Chromium. If your page uses serif Devanagari text, also make Noto Serif Devanagari available. Use the package name appropriate to the target distribution and release, or bundle the font files in the image and ensure Linux font configuration can discover them. Package names and image layouts differ, so there is no single safe installation command for every Linux distribution.

After adding fonts, refresh font discovery with the target distribution’s fontconfig tooling when needed, then start a new Chromium process. The exact cache-refresh command depends on the operating system; adding fonts after a browser process or image cache has already been created may leave the running process unable to see them.

Test with a minimal Puppeteer page

Use a small test to separate font availability from your production page’s CSS, scripts, or network dependencies. This example sets an explicit family, waits for the document fonts, and saves a screenshot. It assumes Puppeteer and a compatible browser are installed and launchable in the environment where you run the script.

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({ headless: true });
  try {
    const page = await browser.newPage();
    await page.setContent(`
      <!doctype html>
      <html lang="hi">
        <meta charset="utf-8">
        <style>
          body { font: 32px "Noto Sans Devanagari", sans-serif; }
        </style>
        <p>नमस्ते दुनिया</p>
      </html>
    `);
    await page.evaluate(() => document.fonts.ready);
    await page.screenshot({ path: 'devanagari-test.png' });
  } finally {
    await browser.close();
  }
})();

Inspect the image and, if necessary, check the browser’s computed font family for the test element. A computed CSS family reports the requested/resolved family information, but the screenshot is still the practical check that the expected glyphs render correctly. If the test still shows tofu or incorrect shaping, verify that the selected browser executable is the one you inspected, that the font files are inside its runtime, and that the chosen font covers the characters in your test string.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Common symptoms and fixes

Symptom Likely cause What to check or do
Blank characters or square boxes No usable font with the needed glyph coverage is visible to Chromium. Check fontconfig inside the screenshot runtime; install or expose a Devanagari font there and restart Chromium.
Some text renders, but a different style fails The requested serif, sans-serif, or fixed-width family resolves differently. Test an explicit family appropriate to the style, then check the corresponding font is available.
It works locally but fails in Docker or CI The deployed container or runner has a different font set or browser build. Run the font and browser checks inside the deployed image or job environment, and add the font to that runtime.
Chromium will not launch A browser dependency or launch configuration may be missing; this is distinct from font coverage. Use Puppeteer’s Linux troubleshooting guidance to diagnose launch dependencies before investigating glyph rendering.
Fonts were added, but the screenshot is unchanged The running browser may not have refreshed font discovery, or the job may use another image or executable. Refresh font discovery as appropriate for the distribution, start a fresh Chromium process, and confirm the runtime and executable again.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

ScreenshotNeo can take a website screenshot through one GET request. Its capture flow accepts cookie or consent banners like a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; each step can be turned off. It bills only clean shots: bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing, and responses identify the page verdict and billing status in headers. It also provides an MCP server with take_screenshot, get_page_info, and capture_pdf tools for AI agents. This is a hosted screenshot alternative, not a way to configure fonts in your own Puppeteer runtime; if you need to control Chromium’s Linux font files directly, use the steps above.

cURL example (see the ScreenshotNeo documentation):

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

ScreenshotNeo’s Free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000. Learn about ScreenshotNeo, or sign up free for 1,000 screenshots a month with no card.

Frequently Asked Questions

Will the March 2026 Chromium font change fix every Linux Puppeteer screenshot?

No. It documents a Chromium source change, but the browser build actually selected in your deployment may differ. Check that executable and its version in the runtime producing the screenshot.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Should I install the font on my host or in my Docker image?

Install or expose it wherever Chromium runs. If the screenshot job runs in a container, a font available only on the host or build machine is not sufficient.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.