PluginProbe
EasyFonts – Host Google Fonts Locally, Fast & Auto-Optimize, GDPR Compliant / 2.0.4
EasyFonts – Host Google Fonts Locally, Fast & Auto-Optimize, GDPR Compliant v2.0.4
2.0.4 2.0.3 2.0.2 2.0.1 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.2 1.3 2.0.0
← All changes | readme.txt +149 -98 1.2 → 2.0.4 View file →
@@ -1,141 +1,192 @@
1 -=== Host Google Fonts Locally – Fast & Super Lightweight (30kb) by EasyFonts ===
2 -Contributors: easywpstuff
3 -Donate link:
4 -Tags: Tags: font, google fonts, gdpr, fonts, host google fonts
5 -Requires at least: 5.0
6 -Tested up to: 6.8.3
7 -Requires PHP: 5.6
8 -Stable tag: 1.2
9 -License: GNU General Public License v2 or later
1 +=== EasyFonts – Host Google Fonts Locally, Fast & Auto-Optimize, GDPR Compliant ===
2 +Contributors: easywpstuff, uzairwp
3 +Tags: google fonts, host google fonts locally, gdpr, core web vitals, font optimization
4 +Requires at least: 6.4
5 +Tested up to: 7.1.3
6 +Requires PHP: 7.4
7 +Stable tag: 2.0.4
8 +License: GPLv2 or later
10 9 License URI: https://www.gnu.org/licenses/gpl-2.0.html
11 10
12 -Locally host google font on your server for faster loading 🚀, and 💯 GDPR & DSGVO friendly fonts. Super lightweight plugin⚡, No server & cpu overload
11 +Host Google Fonts locally, Auto combine and remove duplicate fonts, Auto preload. pass Core Web Vitals — GDPR compliant, auto-config.
13 12
14 13 == Description ==
15 14
16 -Struggling with slow-loading Google Fonts or GDPR compliance issues? EasyFonts is your lightweight solution to **host Google Fonts locally** on your WordPress site. Automatically cache and serve fonts from your server, eliminating external calls to Google that can slow down your site and violate privacy laws like GDPR/DSGVO.
15 +**EasyFonts** is the smart way to **host Google Fonts locally** in WordPress. Activate it and your Google Fonts are detected, downloaded, and served from your own domain — no requests to Google, faster loading, and full **GDPR compliance**.
17 16
18 -In 2022, a German court ruled that loading Google Fonts from Google's servers violates GDPR by logging user IPs for analytics (more on [WPTavern](https://wptavern.com/german-court-fines-website-owner-for-violating-the-gdpr-by-using-google-hosted-fonts)). With EasyFonts, you avoid this entirely – fonts load from your domain, boosting speed and ensuring compliance.
17 +Unlike basic font plugins, EasyFonts doesn't just self-host blindly. It **measures which fonts actually render in real visitors' browsers**, so it can preload your above-the-fold fonts, flag the ones you never use, and generate **zero-CLS metric-matched fallbacks** — the things that actually move your Core Web Vitals (LCP, CLS) scores.
19 18
20 -EasyFonts scans your site, downloads used Google Fonts (and Bunny Fonts), and replaces external links. No coding needed! Improve page speed, reduce DNS requests, and enhance user experience.
19 += Why host Google Fonts locally? =
21 20
22 -= Why Choose EasyFonts for Local Google Fonts? =
23 -- **GDPR/DSGVO Compliant:** No data sent to Google – keep user privacy intact.
24 -- **Faster Site Speed:** Local hosting reduces latency and external dependencies.
25 -- **Easy Setup:** Activate, configure in settings, and let it handle the rest.
26 -- **Lightweight & Efficient:** Minimal impact on your site's resources.
27 -- **Broad Compatibility:** Works with most themes, page builders, and plugins.
21 +1. **GDPR / DSGVO:** German courts have ruled that sending visitor IPs to Google Fonts without consent violates GDPR. Self-hosting removes the connection entirely — no data leaves your server.
22 +2. **Speed & Core Web Vitals:** Every call to `fonts.googleapis.com` and `fonts.gstatic.com` adds DNS lookups, connections, and render-blocking delay that hurt LCP and TTFB. Local hosting kills that latency.
28 23
29 -= How It Works =
30 -1. EasyFonts detects Google Fonts loaded via <link> and @import, or @font-face inside inline <style>.
31 -2. It downloads and caches them locally in WOFF2 format (lightweight and supported by 96%+ of browsers).
32 -3. Replaces external URLs with your site's domain.
33 -4. Optionally removes resource hints and WebFontLoader for cleaner, faster loads.
24 += What EasyFonts does =
34 25
35 -Test your site before/after: Use browser dev tools (Network tab) to check for "fonts.googleapis.com" or "fonts.gstatic.com" requests – they should disappear!
26 +* **Automatic local hosting** — Detects Google Fonts loaded via `<link>` stylesheets, `@import` rules, inline `@font-face`, **theme/plugin CSS files**, **external/CDN stylesheets**, and the **Web Font Loader (webfont.js)** — then downloads and serves them locally.
27 +* **Combine into one stylesheet** — Merges all hosted font CSS into a single file, removes duplicate `@font-face` rules, and can **inline it as minified CSS** so it's not render-blocking.
28 +* **Used vs Unused font discovery** — Automatically identifies fonts that never render on real pages so you can disable unnecessary downloads and preloads.
29 +* **Real usage measurement** — A lightweight beacon measures which font families and weights actually render, and which appear above the fold — directly on your live pages, no loopback crawler.
30 +* **Smart preloading** — Auto-preloads the above-the-fold fonts that matter (capped, so you never over-preload), boosting LCP.
31 +* **font-display control** — Force `font-display: swap` (or block, fallback, optional, auto) on every face to fix "Ensure text remains visible during webfont load."
32 +* **Per-family & per-weight control** — Toggle Load and Preload for any family or individual weight; disable fonts you don't use.
33 +* **Subset trimming** — Keep only the character sets you need (Latin, Cyrillic, Greek, Vietnamese, Arabic, Devanagari, CJK and more) to cut font weight.
34 +* **Zero-CLS fallbacks** — Reads each font's real metrics and generates size-matched fallback faces (`size-adjust`, `ascent-override`) to eliminate layout shift while fonts load.
35 +* **Async / JS-injected font blocking** — Optionally catches Google Fonts injected by JavaScript at runtime and self-hosts them too (handles fonts most plugins miss).
36 +* **Clean resource hints** — Strips now-useless `preconnect`, `dns-prefetch`, and `preload` tags pointing at Google's servers.
37 +* **Variable font support** — Detects and hosts modern variable fonts as a single optimized file instead of many static weights.
38 +* **CDN support** — Serve hosted fonts and the stylesheet from your CDN.
39 +* **Bunny Fonts support** — Also self-hosts fonts from `fonts.bunny.net`.
40 +* **Import / Export settings** — Move your configuration between sites in one click.
41 +* **Multisite ready** — Works per-site across a network, with tables created automatically for new sites.
42 +* **WP-CLI** — Scan and manage fonts from the command line.
43 +* **Page builder & theme compatible** — Elementor, Divi, Bricks, Beaver Builder, WPBakery, Oxygen, plus Astra, GeneratePress, Kadence, Blocksy, and WooCommerce. Editors are automatically excluded so your styling stays intact while you build.
36 44
37 -Compatible with Elementor, WPBakery, Divi, WooCommerce, Smart Slider 3, Groovy Menu, and more. If you're using Bunny Fonts, they're supported too!
45 += Why choose EasyFonts over OMGF and other font plugins? =
38 46
39 -= Benefits of Hosting Google Fonts Locally =
40 -- Reduce page load times by up to 30% with local caching.
41 -- Avoid Cumulative Layout Shift from slow font loading.
42 -- Legal peace of mind for EU users.
43 -- Better SEO: Faster sites rank higher on Google.
47 +* **It measures, not guesses.** EasyFonts sees what actually renders in real browsers, so preload and fallbacks are based on data — not a static guess.
48 +* **Detection most plugins charge for.** Inline CSS, theme/plugin CSS, external stylesheets, and Web Font Loader detection are **free** here — features that are paid add-ons elsewhere.
49 +* **Zero-CLS fallbacks for any font** — generated from real font metrics, not limited to a fixed list.
50 +* **Async JS-injected fonts** — caught and self-hosted, a common gap in other plugins.
51 +* **Truly zero-config.** Activate it and it works; everything else is optional fine-tuning.
52 +* **No data sent anywhere.** All processing is on your server.
44 53
45 -Ready to optimize? Install now and see the difference!
54 += How it works =
46 55
47 -== Features ==
48 -* Automatically detect, cache, and **host Google Fonts locally** using <link> tags.
49 -* Support for Bunny Fonts local hosting.
50 -* Handle @import statements in inline <style> tags for local loading.
51 -* Process @font-face declarations in inline styles and replace with local URLs.
52 -* Remove unnecessary resource hints (preload, preconnect, dns-prefetch) to Google's domains.
53 -* Eliminate WebFontLoader (webfont.js) for cleaner code.
54 -* WOFF2 format only for optimal compression and browser support.
55 -* Compatibility with popular page builders: **Host Elementor Google Fonts locally**, WPBakery, Divi, and any theme.
56 -* Works with WooCommerce, Smart Slider 3, Groovy Menu, and more.
57 -* Lightweight – no bloat, just performance gains.
56 +1. Install and activate EasyFonts.
57 +2. Open **Easy Fonts** in your admin menu.
58 +3. Click **Optimize now** (or just let visitors browse) — fonts are detected, self-hosted, and measured automatically.
59 +4. Review **Used vs Unused** fonts, fine-tune Load/Preload, and adjust settings if you like.
60 +5. Done — your Google Fonts now load locally, faster, and GDPR-compliant.
58 61
59 -== Plugin Compatibility ==
60 -EasyFonts integrates seamlessly with:
61 -- Elementor: Host Elementor Google Fonts on your local server.
62 -- WPBakery Page Builder: Full support for local font loading.
63 -- Divi Theme: Easily host Google Fonts locally for Divi.
64 -- WooCommerce: Fixes checkout issues with external fonts.
65 -- Smart Slider 3 and Groovy Menu: Added in recent updates.
66 -- Most other themes and plugins – if issues arise, contact support!
62 +== Installation ==
67 63
64 +1. Upload the `easyfonts` folder to `/wp-content/plugins/`, or install via **Plugins → Add New**.
65 +2. Activate the plugin through **Plugins → Installed Plugins**.
66 +3. Open **Easy Fonts** from the admin menu.
67 +4. Click **Optimize now** or visit your site's front end — fonts are downloaded and cached automatically.
68 +5. (Optional) Adjust subsets, font-display, CDN, preloading, and other settings.
69 +
68 70 == Frequently Asked Questions ==
69 71
70 -= Is it legal to host Google Fonts locally on my server? =
71 -Yes! Google Fonts are open-source under licenses allowing commercial or personal use on any site.
72 += Does this make my site GDPR compliant for Google Fonts? =
72 73
73 -= Why does EasyFonts use only WOFF2 format for local fonts? =
74 -WOFF2 is the most efficient, lightweight format with 30% better compression than WOFF. It's supported by over 96% of modern browsers, ensuring fast loads without compatibility issues.
74 +Yes. Once active, all Google Fonts are served from your own server — no requests to fonts.googleapis.com or fonts.gstatic.com, so no visitor IPs are sent to Google.
75 75
76 -= How does hosting Google Fonts locally make my site GDPR/DSGVO compliant? =
77 -External Google Fonts send user data (like IPs) to Google's servers. Local hosting keeps everything on your server, preventing data transfers and ensuring compliance.
76 += Will it improve my PageSpeed / Core Web Vitals score? =
78 77
79 -= How can I check if my site is using Google Fonts externally? =
80 -Open browser dev tools (F12), go to the Network tab, filter by "Fonts", and reload. Look for requests to "fonts.googleapis.com" or "fonts.gstatic.com". With EasyFonts, these should be gone!
78 +Yes. Removing external font connections, combining (or inlining) the stylesheet, preloading above-the-fold fonts, and adding zero-CLS fallbacks typically improve LCP and CLS in PageSpeed Insights, GTmetrix, and Lighthouse.
81 79
82 -= Does this work with Elementor or Divi? =
83 -Absolutely! It hosts fonts locally for Elementor, Divi, WPBakery, and more. No extra setup needed.
80 += How is EasyFonts different from just self-hosting? =
84 81
85 -= What if my fonts include special characters or subsets? =
86 -EasyFonts handles standard subsets. If issues occur, check your theme/plugin settings or contact support.
82 +EasyFonts measures which fonts actually render in real browsers, then preloads the important ones, flags unused ones, and matches fallback metrics to prevent layout shift — going well beyond a static download-and-serve.
87 83
88 -= Will this improve my site's speed? =
89 -Yes – local fonts reduce external requests, DNS lookups, and latency. Test with tools like Google PageSpeed Insights.
84 += Does it work with my theme and page builder? =
90 85
91 -= Can I use this with Bunny Fonts? =
92 -Yes, full support added in v1.1.4.
86 +Yes. It processes the final HTML output, so it catches fonts from any theme, plugin, or builder — Elementor, Divi, Bricks, Beaver Builder, WPBakery, Oxygen, Astra, GeneratePress, Kadence, and more. Builder editors are automatically excluded so fonts display correctly while editing.
93 87
94 -= What if I have multiple Google Fonts on different pages? =
95 -EasyFonts caches them all automatically for site-wide optimization.
88 += Does it support variable fonts? =
96 89
97 -= Is there a pro version or add-ons? =
98 -Currently free and feature-packed. Future updates may add more!
90 +Yes. EasyFonts detects variable fonts and hosts them as a single optimized file instead of many separate weight files.
99 91
100 -== Installation ==
101 -1. Upload the plugin folder to `/wp-content/plugins/`.
102 -2. Activate via the 'Plugins' menu in WordPress.
103 -3. Go to Settings > EasyFonts to configure and download your site's Google Fonts locally.
104 -4. Browse your site to trigger detection – that's it!
92 += Does it support Bunny Fonts? =
105 93
106 -For best results, clear your cache after activation.
94 +Yes. Fonts from fonts.bunny.net are detected and self-hosted alongside Google Fonts.
107 95
96 += Can I use a CDN? =
108 97
98 +Yes. Point the CDN setting at your pull-zone and the hosted fonts and stylesheet are served through your CDN.
99 +
100 += Will it work with caching plugins? =
101 +
102 +Yes — WP Rocket, LiteSpeed Cache, W3 Total Cache, WP Super Cache, and others. After optimizing, clear your page cache so visitors get the updated HTML.
103 +
104 += How do I clear the font cache? =
105 +
106 +Open **Easy Fonts → Dashboard** and click **Empty cache**. Fonts are re-detected automatically on the next visit or via **Optimize now**.
107 +
108 += Does it handle Google Fonts from multiple plugins at once? =
109 +
110 +Yes. It finds font stylesheets across your whole page — themes, plugins, and builders — merges them into one file, and removes duplicates.
111 +
109 112 == Screenshots ==
110 -1. [Settings Page: Configure local font hosting options.](assets/screenshot-1.png)
111 113
114 +1. Dashboard — hosted font stats, maintenance, and live detector status
115 +2. Fonts — used vs unused families with per-weight Load and Preload control
116 +3. Settings — subsets, font-display, CDN, inline CSS, and more
117 +4. Usage — what actually renders, measured in real browsers
118 +
112 119 == Changelog ==
113 -= 1.2 =
114 -* Optimized speed and plugin structure for better performance.
115 120
116 -= 1.1.4 =
117 -* Added Bunny Fonts support.
118 121
119 -= 1.1.3 =
120 -* Fixed security issues.
122 += 2.0.4 =
123 +* Fixed: browser console warning "…was preloaded using link preload but not used…". After a settings change, the preloaded fonts and the font stylesheet could point at two different versions of the same font file, so each preloaded font was downloaded twice and the preload was wasted. Every link to a font now carries the same version, taken from the font file itself.
124 +* Fixed: on page-cached sites the measurement beacon failed with 403 "Cookie check failed" once a cached page was a day old. WordPress rejected the page's expired nonce before Easy Fonts could check its cache-safe token, so Smart Preload and per-page font loading stopped learning. The beacon now sends only the token, and beacons from pages cached by older versions are accepted again as soon as you update. The async font reporter gets the same fix.
125 +* Fixed: the beacon and the async font reporter now work on sites with plain permalinks (they returned 404 there).
126 +* Fixed: after Purge, the inlined font stylesheet could keep old font links for up to a day.
127 +* Improved: Smart Preload now preloads the exact weights a page shows above the fold, instead of every weight of the font family. A family with many weights no longer fills the preload slots with weights the page never uses.
128 +* Improved: at most 3 fonts are preloaded per page (was 6), so fonts compete less with your main image. Your "always preload" choices now take their slots first. Filter: `easyfonts_preload_cap`.
129 +* Improved: Smart Preload picks the character set of your site's language, for example the Cyrillic file on a Russian site or the Greek file on a Greek site, instead of always the Latin one. Filter: `easyfonts_preload_subset`.
130 +* Performance: saving settings no longer makes every returning visitor download all fonts again. A font's URL now changes only when the font file itself changes.
121 131
122 -= 1.1.2 =
123 -* Resolved WooCommerce checkout font issues.
132 += 2.0.3 =
133 +* Fixed: database error "BIGINT UNSIGNED value is out of range" fired on nearly every render — Smart Preload's weight matching now uses signed arithmetic, so preloads work again on stock MySQL/MariaDB. Props @harryfear for the excellent report.
134 +* Fixed: beacon throttling and data retention were skewed on sites with a non-UTC timezone; all internal timestamps are now stored and compared in UTC.
135 +* Fixed: a failed external stylesheet fetch is now remembered (negative cache), so an unreachable CSS host can no longer add its full timeout to every page view. New filters: easyfonts_css_timeout, easyfonts_css_fail_ttl.
136 +* Fixed: the measurement beacon now works on page-cached sites — a cache-safe token authorises it, so an expired cached nonce no longer silently stops measurements.
137 +* Improved: a font is scoped off a page only after multiple consistent beacon measurements (filter easyfonts_scope_out_min_measurements, default 2), so a single bad or forged report can't remove a font.
138 +* Security: beacon routes are normalised to canonical paths, and the decisions table is now hard-capped in weekly cleanup (filter easyfonts_gc_max_decision_rows) so anonymous requests can't grow it without bound.
139 +* Security: cache-buster bumps from the async-fonts endpoint are rate-limited (filter easyfonts_async_bump_interval).
140 +* Security: the background warm key is rotated on Purge and Repair, and cache path handling is hardened against traversal re-forming.
141 +* Improved: upserts are deprecation-free on MySQL 8.0.20+ (row-alias syntax where supported; VALUES() retained on MariaDB, where it remains the native form).
142 +* Performance: the inlined font stylesheet is minified once and cached; a duplicate-insert race in font registration now falls back to an update; cleanup deletes are replication-safe; new indexes on usage/decision timestamps.
124 143
125 -= 1.1.1 =
126 -* General improvements.
144 += 2.0.2 =
145 +* New: per-page font scoping. Each page now loads only the fonts it actually uses. Many themes (e.g. Blocksy) enqueue their whole Google-fonts set on every page; Easy Fonts now measures what each page really renders (in a real browser) and leaves the unused families off that page's stylesheet — while still hosting them on the pages that do use them. Matching is done at the family level and is self-correcting: a font is scoped out only after the page has been measured, it returns automatically if the page starts using it, and a font is never dropped from a page that hasn't been measured yet.
146 +* Fixed: a font declared on a page is no longer wrongly dropped from the combined CSS because of a weight/style mismatch (e.g. a single-weight family used at a bold weight). Usage is now matched per family.
147 +* Improved: the combined stylesheet is unique per page font-set and shared when identical. Pages that use the same fonts reuse the same cached file; a page with a different set gets its own. Identical sets are never regenerated, saving CPU and disk.
148 +* Improved: used/unused classification stays current. Beacon measurements now refresh hourly instead of being locked for a week, so a font that starts (or stops) being used is reflected quickly, and "Optimize" forces an immediate fresh measurement of the homepage.
149 +* Fixed: preloads are accurate and page-specific. A font is preloaded on a page only when it actually renders above the fold there (matched per family, so a face the browser shows at a different weight than the hosted file — e.g. a single-weight family shown bold — still preloads correctly). A font above the fold on just one page is preloaded only on that page; a font above the fold on every page is preloaded everywhere from a cached set, with no per-page lookup. Your manual "always preload" choices are respected wherever the family is used.
150 +* Fixed: page counts and usage are keyed by the page path, so cache-buster and probe parameters (and tracking/builder query strings) can no longer inflate the dashboard with duplicate rows.
151 +* Improved: URL exclusions now match precisely — "/cart" no longer also excludes "/cart-guide". Patterns match the exact path or a path-segment prefix, and support wildcards (e.g. "/shop/*").
152 +* Improved: when the master toggle is off, Easy Fonts adds nothing at all to the front end (no measurement or helper scripts).
153 +* Improved: front-end scripts are now served minified.
154 +* Performance: fewer database writes per page render (font registration is batched), usage logging is batched into a single write and rate-limited per page, and a dead database index was retired.
155 +* Security/hardening: strict sanitisation of all values written into the generated @font-face CSS; stylesheet fetching is restricted to public hosts (internal/private addresses are blocked) with parsed-host provider matching; and local stylesheet reads are limited to genuine .css files with path-traversal blocked.
156 +* Developer: filters `easyfonts_page_scope_fonts` (set false to disable per-page scoping), `easyfonts_force_families` (always-load safelist), `easyfonts_preload_cap`, and `easyfonts_beacon_throttle_hours`.
127 157
128 -= 1.1.0 =
129 -* Minor fixes; added Smart Slider 3 and Groovy Menu support.
158 += 2.0.1 =
159 +* Fixed: rare white screen / blank front-end on some hosts (esp. FastCGI/cgi-fcgi). Font binaries are no longer downloaded during a visitor's page render — they are fetched by a non-blocking background warm request, so a slow or blocked outbound connection can never stall the page.
160 +* Fixed: the output buffer now fails open — if anything goes wrong while optimising a page, the original HTML is always returned instead of a blank page.
161 +* Improved: provider <link> tags are only removed once their fonts are confirmed hosted locally, so the page never loses its fonts while the cache warms.
162 +* Improved: provider stylesheet CSS is cached, so font detection no longer hits the network on every page load.
163 +* Hardened: guard for WordPress's HTML API, safer regex handling, and PHP 7.4 compatibility shims.
164 +* Note: no settings, styling, or features changed. After activation (or after changing fonts) the first visit serves the original fonts for a moment while the cache warms in the background, then switches to self-hosted automatically. You can also warm immediately from Settings → Optimize.
165 +* Fixed: the real cause of the blank front-end — two regular expressions that scanned the whole page (the inline <style> processor and the Web Font Loader remover) could exhaust the PCRE2 engine on large pages (e.g. page-builder inline CSS or big inline scripts) and either return nothing or crash the PHP worker, blanking the page with no catchable error. Both are now linear text scans that cannot backtrack or overflow.
166 +* Hardened: every remaining regular expression that rewrites page/CSS content now falls back to the original content if the engine fails, so a pattern can never blank the page. Added a final safety net that discards the processed page if it ever comes out empty.
167 +* Added: a size cap for individual inline <style> blocks (filterable) to skip pathologically large blocks safely.
130 168
131 -= 1.0.4 =
132 -* Fixed special characters in Google Fonts URLs.
169 += 2.0.0 =
170 +* New: real-browser usage measurement — see which fonts render and which are above the fold.
171 +* New: smart auto-preload of above-the-fold fonts (capped) for better LCP; your manual choices are always respected.
172 +* New: zero-CLS metric-matched fallback fonts generated from real font metrics.
173 +* New: detect and self-host fonts from inline CSS, theme/plugin CSS, external/CDN stylesheets, and the Web Font Loader (webfont.js).
174 +* New: optional async / JS-injected Google Fonts blocker.
175 +* New: full subset selection (Latin, Cyrillic, Greek, Vietnamese, Arabic, Devanagari, CJK, and more).
176 +* New: CDN support for hosted fonts and the stylesheet.
177 +* New: inline the combined stylesheet as minified CSS (not render-blocking).
178 +* New: per-family and per-weight Load / Preload control, with used vs unused grouping.
179 +* New: settings Import / Export.
180 +* New: Multisite support and WP-CLI commands.
181 +* New: redesigned, faster admin interface.
182 +* Improved: variable font detection and single-file hosting.
183 +* Improved: font-display control across all @font-face declarations.
184 +* Improved: resource-hint cleanup and duplicate @font-face removal.
133 185
134 -= 1.0.3 =
135 -* Handled fonts starting with //.
186 +== Upgrade Notice ==
136 187
137 -= 1.0.2 =
138 -* Fixed HTTP protocol issues.
188 += 2.0.4 =
189 +Fixes the "preloaded but not used" console warning and the beacon 403 on page-cached sites, and preloads only the fonts a page really shows. Clear your page cache after updating.
139 190
140 -= 1.0.0 =
141 -* Initial release.
191 += 2.0.0 =
192 +Major update: real-browser usage measurement, smart preloading, zero-CLS fallbacks, broader font detection (inline/theme/external/webfont.js), subsets, CDN, and a redesigned admin. Recommended for everyone.