Example HTML for Recursive Variable Subsets

The subset fonts in this example use CSS unicode-range to load progressively, as needed. To quote MDN:

The unicode-range CSS descriptor sets the specific range of characters to be used from a font defined by @font-face and made available for use on the current page. If the page doesn't use any character in this range, the font is not downloaded; if it uses at least one, the whole font is downloaded.

See Appendix below for information on further font optimization strategies.

subset_range_english_basic

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 _ - ( ) [ ] { } # % \' " ‘ ’ “ ” * . , : ; ! ? / \ | @ & • + = < > ← ↑ → ↓ $ ^ ~ ©

subset_range_latin_1_punc

ª º ¹ ² ³ ¼ ½ ¾ « » ¡ ¿ ¦ § ¶ · ± ¬ ↔ ¢ £ ¤ ¥ ´ ¯ ¨ ¸ ® ° ↕ ↖ ↗ ↘ ↙ µ

subset_range_latin_ext

Ā Ă Ą Ć Ĉ Ċ Č Ď Ē Ĕ Ė Ę Ě Ĝ Ğ Ġ Ģ Ĥ Ĩ Ī Ĭ Į İ Ĵ Ķ Ĺ Ļ Ľ Ń Ņ Ň Ō Ŏ Ő Ŕ Ŗ Ř Ś Ŝ Ş Š Ţ Ť Ũ Ū Ŭ Ů Ű Ų Ŵ Ŷ Ÿ Ź Ż Ž Đ Ħ IJ Ŀ Ł Ŋ Œ Ŧ ā ă ą ć ĉ ċ č ď ē ĕ ė ę ě ĝ ğ ġ ģ ĥ ĩ ī ĭ į ĵ ķ ĺ ļ ľ ń ņ ň ō ŏ ő ŕ ŗ ř ś ŝ ş š ţ ť ũ ū ŭ ů ű ų ŵ ŷ ź ż ž đ ħ ı ij ĸ ŀ ł ʼn ŋ œ ŧ

subset_range_vietnamese

Ă Ạ Ả Ấ Ầ Ẩ Ẫ Ậ Ắ Ằ Ẳ Ẵ Ặ Ẹ Ẻ Ẽ Ế Ề Ể Ễ Ệ Ĩ Ỉ Ị Ơ Ọ Ỏ Ố Ồ Ổ Ỗ Ộ Ớ Ờ Ở Ỡ Ợ Ũ Ư Ụ Ủ Ứ Ừ Ử Ữ Ự Ỳ Ỵ Ỷ Ỹ Đ ă ạ ả ấ ầ ẩ ẫ ậ ắ ằ ẳ ẵ ặ ẹ ẻ ẽ ế ề ể ễ ệ ĩ ỉ ị ơ ọ ỏ ố ồ ổ ỗ ộ ớ ờ ở ỡ ợ ũ ư ụ ủ ứ ừ ử ữ ự ỳ ỵ ỷ ỹ đ ₫

subset_range_remaining

Ǻ Ȁ Ȃ Ḉ Ḍ Ḏ Ȅ Ȇ Ḕ Ḗ Ḝ Ǧ Ḡ Ḥ Ḫ Ȉ Ȋ Ḯ Ḷ Ḻ Ṃ Ṅ Ṇ Ṉ Ǫ Ȍ Ȏ Ȫ Ȭ Ȱ Ṍ Ṏ Ṑ Ṓ Ȑ Ȓ Ṛ Ṟ Ș Ṡ Ṣ Ṥ Ṧ Ṩ Ț Ṭ Ṯ Ȕ Ȗ Ṹ Ṻ Ẁ Ẃ Ẅ Ȳ Ẏ Ẓ Ǽ Ǿ Ə Ɲ DŽ LJ NJ DZ ẞ Ω ǻ ȁ ȃ ḉ ḍ ḏ ȅ ȇ ḕ ḗ ḝ ǧ ḡ ḥ ḫ ȉ ȋ ḯ ḷ ḻ ṃ ṅ ṇ ṉ ǫ ȍ ȏ ȫ ȭ ȱ ṍ ṏ ṑ ṓ ȑ ȓ ṛ ṟ ș ṡ ṣ ṥ ṧ ṩ ț ṭ ṯ ẗ ȕ ȗ ṹ ṻ ẁ ẃ ẅ ȳ ẏ ẓ ǽ ǿ dž lj nj dz ȷ ə ɲ π Dž Lj Nj Dz ʹ ʺ ʻ ʼ ʾ ʿ ˈ ˉ ˊ ˋ ˌ ̀ ́ ̂ ̃ ̄ ̆ ̇ ̈ ̉ ̊ ̋ ̌ ̏ ̑ ̒ ̕ ̛ ̣ ̤ ̥ ̦ ̧ ̨ ̮ ̱ ̵ ⁰ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ⅓ ⅔ ⅛ ⅜ ⅝ ⅞ ‐ ‒ – — ― ⟨ ⟩ ‰ ‚ „ ‹ › † ‡ … ⁄ ℓ № ′ ″ ‾ − ≤ ≥ ≈ ≠ ⁒ ∂ ∅ ∆ ∏ ∑ ∕ ∙ √ ∞ ∫ ≡ ▷ ◁ ฿ ₡ ₦ ₨ ₩ ₪ € ƒ ₭ ₱ ₲ ₴ ₵ ₸ ₹ ₺ ₼ ₽ ₿ ˝ ˆ ˇ ˘ ˜ ˙ ˚ ˛ ™ ℮ ■ □ ▲ △ ▶ ▼ ▽ ◀ ◆ ◇ ◊ ☐ ☑ ♡ ♥ ✓

Appendix

There are ways to further optimize Recursive:

  1. If you only need part of the stylistic range (e.g. Monospace 0, Casual 1, Weight 300-800), variable fonts can be “instanced” or “partially instanced” with the FontTools Instancer. You can do it locally on the command line or in a Python script. Alternatively, the Google Fonts API allows you to do this by requesting a special URL, and the “Get Recursive” section of the Recursive Minisite has a UI to help construct these URLs.
  2. You can tailor subsets and CSS unicode-range to your specific use case. E.g. if you are specifically writing in only English & Spanish, you could make a subset for this, using the FontTools Subsetter or by adapting my Recursive subsetting script if you want.
  3. You can combine instancing and subsetting. For instance, if you want a particular font style for just a website’s logo, you could make a font file that just includes characters in the single style (or style range) you need for that, and load it separately. For example, the website https://sia.codes/ does something like this for the name Sia on the homepage.

If you want to optimize these fonts but don’t want to use fonts from Google Fonts and also don’t want to dig into code to optimize them on your own, please consider reaching out to Arrow Type to commission custom subsetting & instancing.