FontARA is a cross-browser WebExtension for applying your preferred fonts across the web. It supports multilingual pages through built-in, system, Google, and custom fonts, with special support for RTL-first workflows: smart RTL text detection, editable-field auto-direction, and curated per-site RTL handling.
- Install
- What Changes After Install
- User Features
- Preview
- Built-in Site Optimizations
- Browser Support
- Development Quick Start
- Architecture at a Glance
- Privacy and Permissions
- Troubleshooting
- Known Limitations
- Quality
- Roadmap
- Documentation
- Changelog
- Contributing
- Contributors
- Sponsors
Most users should install FontARA from the browser store. Local release builds are mainly for testers, reviewers, and contributors.
| Browser | Store | Local release build | Browser automation |
|---|---|---|---|
| Chrome | Chrome Web Store | pnpm build:chrome |
Stable and beta |
| Firefox | Firefox Add-ons | pnpm build:firefox |
Latest, beta, and ESR |
| Opera | Opera Add-ons | pnpm build:opera |
Manual smoke |
| Edge | Build locally | pnpm build:edge |
Chromium-compatible package |
| Brave | Build locally | pnpm build:brave |
Chromium-compatible package |
| Safari-style MV3 package | Build locally | pnpm build:safari |
Package output only |
| Before FontARA | After FontARA |
|---|---|
| Websites use their own font stacks, which can vary heavily between apps and operating systems. | A selected built-in, system, Google, or custom font can be applied globally, per site, or through a site profile. |
| RTL text in mixed-language editors can inherit awkward direction and alignment from the page. | Smart RTL can detect RTL scripts, adjust editable fields, and apply curated RTL adapters on supported apps. |
| Some websites need one-off CSS fixes to avoid changing icons, code, or generated UI glyphs. | Bundled site CSS targets readable text while protecting icon fonts, code blocks, SVGs, and inline font targets. |
| Browser extension settings can become hard to move between machines. | Backup, import, export, reset, and sync-friendly settings keep the setup portable. |
- Font replacement across the web through built-in, system, Google, and custom font sources.
- Works on normal websites the user enables, with built-in optimized support for AI tools, search, social, productivity, and publishing sites such as ChatGPT, Claude, Gemini, Copilot, Perplexity, Google, YouTube, Gmail, X, LinkedIn, Instagram, Facebook, GitHub, Telegram, Slack, Trello, Wikipedia, DuckDuckGo, Medium, Goodreads, Dropbox, and more.
- Per-site font and text-stroke profiles.
- Smart RTL support for right-to-left scripts, editable text surfaces, and curated site adapters.
- Custom font uploads with local-only storage.
- Backup, import, export, reset, sync settings, and cross-browser MV3 builds for Chrome, Firefox, Edge, Brave, Opera, and Safari-style packages.
- Pure WebExtension build pipeline with browser-specific MV3 targets.
- Centralized site configuration for activation, CSS fixes, profiles, and RTL.
- Unit, inject, and real-browser extension tests.
- Manual and nightly browser matrix for Chrome stable/beta and Firefox latest/beta/ESR.
- Firefox review packaging and extension lint support.
The screenshots below show the popup, options page, site controls, and browser integration.
FontARA is not limited to the sites below. The extension can apply your selected font on normal web pages you enable through global mode, include/exclude rules, the popup current-site toggle, or per-site profiles. Browser-internal pages and other restricted pages are covered under Known Limitations.
The curated list below is FontARA's built-in optimized support. It currently ships with 30 site entries, 26 bundled site CSS files, and 10 smart RTL site adapters. These sites get faster and higher-quality font application through targeted CSS injection, careful text selectors, icon/code protection, and curated RTL behavior where needed. With help from users and contributors, this optimized list can keep growing.
| Area | Examples |
|---|---|
| AI tools | ChatGPT, Claude, Gemini, Copilot, Perplexity, Poe, DeepSeek, Qwen, NotebookLM, AI Studio, Arena |
| Search and Google apps | Google, Gmail, YouTube, DuckDuckGo |
| Social and communities | X, LinkedIn, Instagram, Facebook, GitHub |
| Messaging and productivity | WhatsApp, Telegram, Slack, Messages, Trello, Dropbox |
| Reading and publishing | Wikipedia, Medium, Goodreads |
General font injection works across the web. Site matching, optimized CSS fixes,
profiles, and RTL adapters for the built-in list are maintained in src/config
and documented in docs/site-fixes.md.
| Target | Build command | Test coverage | Notes |
|---|---|---|---|
| Chrome MV3 | pnpm build:chrome |
Local, CI, and browser workflow | Primary Chromium release target. |
| Firefox MV3 | pnpm build:firefox |
Local and browser workflow | Includes Firefox review packaging and web-ext lint. |
| Edge MV3 | pnpm build:edge |
Chromium-compatible package | Store release should still be smoke-tested manually. |
| Brave MV3 | pnpm build:brave |
Chromium-compatible package | Uses the Chromium extension package path. |
| Opera MV3 | pnpm build:opera |
Manual smoke | Store behavior should be checked before publishing. |
| Safari-style MV3 | pnpm build:safari |
Package output only | Generated package structure, not a guaranteed App Store build. |
FontARA is built as a pure WebExtension. Source manifests live in
src/manifest*.json, runtime code is split across src/background,
src/inject, src/ui, src/config, and src/utils, and the build pipeline
lives in tasks.
Requirements:
- Node.js 24
- pnpm 11
pnpm install
pnpm devThe default development command watches and rebuilds the Chrome MV3 debug
extension at build/chrome-mv3-dev.
Common commands:
| Command | Purpose |
|---|---|
pnpm dev |
Watch Chrome MV3 debug build. |
pnpm dev:firefox |
Watch Firefox MV3 debug build. |
pnpm build |
Package Chrome MV3 release build. |
pnpm build:all |
Package all configured MV3 release targets. |
pnpm check |
Run lint, typecheck, unit tests, and inject tests. |
pnpm verify |
Run check, all release builds, and extension lint. |
pnpm test:browser:chrome |
Run real Chrome extension browser tests. |
FONTARA_FIREFOX_BROWSER_TESTS=1 pnpm test:browser:firefox |
Run real Firefox extension browser tests. |
Popup / Options
-> Background runtime
-> Storage and site manager
-> Tab notification
-> Content script
-> Page styles without reload
For the detailed runtime map, see docs/architecture.md.
FontARA needs broad page access because fonts are applied by a content script on the websites that the user enables. That permission allows the extension to work across the web; global, include, exclude, and per-site settings still decide where FontARA actually changes the page. The extension uses storage for settings, custom font records, site lists, backup/import data, and syncable preferences.
| Permission or capability | Why FontARA needs it | Privacy note |
|---|---|---|
<all_urls> content script and host access |
Apply fonts and site CSS on pages where the user enables FontARA. | Activation still respects global, include, exclude, and per-site settings. |
storage |
Save settings, site lists, profiles, backup/import state, and syncable preferences. | Settings are stored in browser extension storage. |
unlimitedStorage |
Store custom font records and larger local settings safely. | Custom font files stay local and are excluded from sync storage. |
tabs |
Read the current tab URL for popup state, current-site toggles, and tab notifications. | FontARA does not collect browsing history. |
fontSettings |
List installed system fonts on Chromium-based browsers. | Firefox builds omit this permission. |
contextMenus |
Provide quick extension actions from the browser context menu. | Optional on Chromium builds and required by Firefox packaging. |
| Web accessible font assets | Let pages load bundled extension font files through injected CSS. | Only bundled font assets are exposed. |
| Google Fonts network access | Request the selected Google Font CSS and font file when Google Fonts are enabled. | No Google API key is needed at runtime; requests happen for the selected font only. |
- Custom font files are stored locally and are excluded from sync storage.
- Runtime font loading requests only the selected Google Font CSS when Google fonts are enabled.
- Site-specific CSS is bundled with the extension and mapped through the configuration layer.
- Extension pages use a locked-down content security policy and expose only font assets to web pages.
| Problem | What to check |
|---|---|
| Changes do not appear on the current page. | Toggle the current site from the popup, then wait a moment. Font changes should apply without a page reload; if a site still needs reload, report it with the Site Issue template. |
| A manually typed include/exclude pattern does not match. | Prefer a plain host like chatgpt.com, a path like google.com/maps, or an explicit wildcard such as https://*.wikipedia.org/*. The popup current-site toggle is the safest way to capture the active site. |
| Icons or code changed unexpectedly. | Report the site. FontARA intentionally protects icon fonts, pre, code, SVGs, and inline font targets, so this usually needs a site CSS fix. |
| A Google Font is not loading. | Confirm Google Fonts are enabled and the selected family exists in the generated catalog. Runtime loading uses fonts.googleapis.com and fonts.gstatic.com. |
| A custom font disappeared after sync. | Custom font files are local-only by design. Export a backup on the source browser and import it on the target browser. |
| Firefox behaves differently from Chrome. | Run FONTARA_FIREFOX_BROWSER_TESTS=1 pnpm test:browser:firefox and check docs/testing.md. |
- Browser-restricted pages such as extension stores, internal browser pages, and some privileged Mozilla domains may block content scripts.
- Cross-origin iframes depend on browser extension rules and may not expose the same runtime state as the top frame.
- Some websites ship high-churn generated selectors. FontARA protects against known brittle selector patterns, but site CSS may still need updates after a major website redesign.
- Safari-style output is generated for package compatibility work, but it is not the same as a finished Safari App Store submission.
- Google Fonts require network access to Google font endpoints when that source is selected. Bundled, system, and custom fonts do not need Google Fonts requests.
- Main CI runs lint, typecheck, unit tests, inject tests, release builds, and extension lint.
- Browser automation covers popup flows, options flows, current-site include/exclude, backup/import/reset, storage stress, Shadow DOM, iframes, SPA updates, lazy DOM, virtualized lists, and viewport rendering.
- A separate manual/nightly browser workflow runs Chrome and Firefox channel coverage.
- Generate built-in site optimization documentation directly from
src/config. - Expand real-browser coverage for more Chromium channels and Firefox ESR release gates.
- Add more curated RTL adapters and per-site profile presets.
- Improve store-release automation and screenshot freshness checks.
- Keep site CSS hygiene tests strict as new websites are added.
See CHANGELOG.md for release notes, migration notes, and known release issues.
Contributions are welcome. Start with CONTRIBUTING.md before opening a pull request, especially for site fixes, browser behavior changes, and new settings.
If a website renders incorrectly, use the Site Issue template and include the exact URL, browser version, selected font, and whether the page only updates after reload.
Please also read the Code of Conduct and Security Policy.
FontARA development is sponsored by Mu.chat, a platform for building AI support and sales chatbots.
If your company uses FontARA or wants to support better typography on the web, sponsorship helps maintain browser compatibility, site fixes, testing, and release work.
The extension ships a generated Google Fonts catalog, so normal builds do not
need a Google API key. To refresh that catalog from Google Fonts Developer API
v1, provide the key through your shell, a CI secret, or a local gitignored
.env.local file:
GOOGLE_FONTS_API_KEY="your-key" pnpm generate:google-fontsFor local development, copy .env.example to .env.local and fill the key.
Never commit a real Google API key. Runtime font loading uses the public CSS2
endpoint for the selected font only.
Thank you to Saber Rastikerdar, Saleh Suzanchi, and Amin Abedi for permission to use their fonts in this extension. Thank you also to everyone who has tested, reported issues, contributed fixes, or supported the project.
FontARA is released under the MIT License.