Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

65 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

emojifonts

macOS-renderable color emoji fonts, rebuilt automatically from upstream.

Upstream emoji fonts often ship in formats macOS can't draw (COLRv1, CBDT). This repo rebuilds each one into the formats Core Text does render โ€” sbix, COLRv0, OT-SVG and plain glyf โ€” and publishes them to a rolling latest pre-release.

Comparison

3 representative emoji per category, rendered from the locally built release fonts. Each cell shows three 32 px glyphs; a dash means the font has no glyph for that set.

Color sets

Apple Noto Twemoji OpenMoji Blobmoji Toss Face Fluent 3D Fluent Flat EmojiTwo
Smileys
๐Ÿ˜€ ๐Ÿ˜‚ ๐Ÿ˜
People
๐Ÿ‘‹ ๐Ÿค” ๐Ÿ’ช
Animals
๐Ÿถ ๐Ÿฑ ๐Ÿผ
Food
๐Ÿ• ๐Ÿ” ๐Ÿฃ
Travel
๐Ÿš— โœˆ ๐Ÿš€
Activity
โšฝ ๐ŸŽฎ ๐ŸŽธ
Objects
๐Ÿ’ก ๐Ÿ“ฑ ๐ŸŽ
Symbols
โค โญ ๐Ÿ”ฅ
Flags
๐Ÿ ๐Ÿด ๐Ÿšฉ
Country flags
๐Ÿ‡บ๐Ÿ‡ธ ๐Ÿ‡ฏ๐Ÿ‡ต ๐Ÿ‡ฌ๐Ÿ‡ง
โ€” โ€”

Fluent 3D, Fluent Flat, and Fluent Mono have no country-flag glyphs.

Monochrome sets

Monochrome fonts render in whatever color the surrounding text uses (shown here on a transparent background โ€” they appear black in light mode).

Noto Mono Fluent Mono
Smileys
๐Ÿ˜€ ๐Ÿ˜‚ ๐Ÿ˜
People
๐Ÿ‘‹ ๐Ÿค” ๐Ÿ’ช
Animals
๐Ÿถ ๐Ÿฑ ๐Ÿผ
Food
๐Ÿ• ๐Ÿ” ๐Ÿฃ
Travel
๐Ÿš— โœˆ ๐Ÿš€
Activity
โšฝ ๐ŸŽฎ ๐ŸŽธ
Objects
๐Ÿ’ก ๐Ÿ“ฑ ๐ŸŽ
Symbols
โค โญ ๐Ÿ”ฅ
Flags
๐Ÿ ๐Ÿด ๐Ÿšฉ
Country flags
๐Ÿ‡บ๐Ÿ‡ธ ๐Ÿ‡ฏ๐Ÿ‡ต ๐Ÿ‡ฌ๐Ÿ‡ง
โ€”

Download

Direct links to the current latest pre-release (file sizes shown). Pick the format your renderer supports โ€” see Formats below.

Vendor License sbix COLRv0 OT-SVG mono
Noto Color Apache / OFL 10 MB โ€” 14 MB โ€”
Noto (mono) OFL-1.1 โ€” โ€” โ€” 1.8 MB
Blobmoji OFL-1.1 12 MB โ€” โ€” โ€”
Fluent 3D MIT 37 MB โ€” โ€” โ€”
Fluent Flat MIT โ€” โ€” 6.3 MB โ€”
Fluent (mono) MIT โ€” โ€” โ€” 1.0 MB
Twemoji CC-BY-4.0 27 MB 1.7 MB 9.5 MB โ€”
OpenMoji CC-BY-SA-4.0 6.4 MB 2.5 MB 2.9 MB โ€”
EmojiTwo CC-BY-4.0 19 MB โ€” โ€” โ€”
Toss Face free (Toss) 12 MB โ€” โ€” โ€”

Every file lives at โ€ฆ/releases/download/latest/<name> โ€” substitute the variant suffix:

https://github.com/iebb/emojifonts/releases/download/latest/<font>.ttf          # sbix (or mono)
https://github.com/iebb/emojifonts/releases/download/latest/<font>-colrv0.ttf   # COLRv0
https://github.com/iebb/emojifonts/releases/download/latest/<font>-svginot.ttf  # OT-SVG

This table is a snapshot of the rolling latest; the Sets table lists every format each action targets โ€” COLRv0 / OT-SVG variants land as those actions next rebuild.

Programmatically: manifest.json (published alongside the fonts) lists every font with its label, license, upstream, detected Emoji version, and a download URL per format:

{ "key": "twemoji", "emoji_version": "17.0", "kind": "color",
  "formats": { "sbix": ".../twemoji.ttf", "colrv0": ".../twemoji-colrv0.ttf",
               "svginot": ".../twemoji-svginot.ttf" } }

Install as macOS system font

Replacing the sealed system font is the only route that changes auto-typed emoji in all apps. It requires SIP and authenticated-root to be disabled first โ€” see iebb/emojiswap โ†’ system-font/README.md for the one-time Recovery steps.

Once security is lowered, install-system.sh presents a numbered picker and handles the rest โ€” download, backup, mount, install, bless:

./install-system.sh            # interactive picker
sudo ./install-system.sh noto  # or pass a set key directly
sudo ./install-system.sh apple # restore the backed-up original
sudo reboot

It backs up the pristine original to backup/ beside the script on first run (never clobbering an existing backup), and prints an undo command at the end. Re-run after any macOS update (updates reseal the system volume).

Formats

Color-emoji fonts carry the artwork in one of several tables; each renderer supports a different subset. What we publish, and where it draws:

Format Filename macOS Chrome Firefox What's inside
sbix <font>.ttf โœ“ โœ“ยน โœ“ the vendor's PNG bitmaps โ€” pixel-exact art (gradients, 3-D, texture)
COLRv0 <font>-colrv0.ttf โœ“ โœ“ โœ“ layered vector, flat palette colors โ€” sharp at any size, no gradients
OT-SVG <font>-svginot.ttf โœ“ โœ— โœ“ full vector SVG with gradients โ€” best vector fidelity
glyf (mono) <font>.ttf โœ“ โœ“ โœ“ plain outlines, no color โ€” paints in the current text color

ยน Chrome/Skia can't read sbix directly, so our sbix builds embed empty "box" glyf outlines: Chrome maps the codepoint to a glyph and then shows the bitmap over it.

  • sbix (bitmap) โ€” the universal default; every color set ships it. Reproduces the vendor's art exactly, because it is their PNGs. Trade-offs: largest files, and a fixed resolution (soft if blown up far past the strike size). Native on macOS; Chrome needs the box-glyf trick above.
  • COLRv0 (flat vector) โ€” tiny, infinitely sharp, renders in every modern engine. But each glyph is a stack of solid-color shapes from a palette, so it only fits art that's already flat (Twemoji, OpenMoji). Gradient-heavy sets (Noto, Fluent 3-D) can't be expressed without exploding the glyph count and dropping their shading, so they get no COLRv0.
  • OT-SVG (vector + gradients) โ€” keeps gradients and fine detail at any size for a fraction of a bitmap's bytes. The catch: Chrome's Skia ignores the SVG table (you get fallback/tofu), so it's effectively a macOS + Firefox format.
  • glyf (mono) โ€” not color at all: a normal outline font that paints in whatever color the surrounding text is, like an icon/dingbat font. Works literally anywhere text renders. (Noto mono, Fluent mono.)

macOS Core Text renders sbix, COLRv0, OT-SVG and plain glyf โ€” but not COLRv1 or CBDT, which is exactly why upstream CBDT/COLRv1 fonts are rebuilt here.

Sets

Work is organised as actions โ€” one per upstream repo โ€” each producing one or more variant fonts:

Action (upstream) Font(s) License Built as
noto ยท googlefonts/noto-emoji noto Apache-2.0 / OFL sbix + OT-SVG
noto-mono ยท google/fonts noto-mono OFL-1.1 as-is (mono glyf)
blobmoji ยท C1710/blobmoji blobmoji OFL-1.1 sbix + OT-SVG
fluent ยท tetunori/fluent-emoji-webfontยฒ fluent, fluent-flat MIT sbix (3D) + OT-SVG (flat)
fluent-mono ยท microsoft/fluentui-emoji fluent-mono MIT mono glyf (from High-Contrast SVGs)
twemoji ยท jdecked/twemoji twemoji CC-BY-4.0 sbix + COLRv0 + OT-SVG
openmoji ยท hfg-gmuend/openmoji openmoji CC-BY-SA-4.0 sbix + COLRv0 + OT-SVG (prebuilt)
emojitwo ยท EmojiTwo/EmojiTwo emojitwo CC-BY-4.0 sbix + COLRv0 + OT-SVG
tossface ยท toss/tossface tossface free as-is (sbix)

Build notes. sbix builds get box-glyf outlines so they render in Chrome (Skia), not just Core Text. OT-SVG is built from per-codepoint SVGs (via nanoemoji/picosvg, normalized to 1 em). For SVG-sourced sets (Twemoji, EmojiTwo) the sbix is rasterized straight from the SVGs with resvg and assembled over the COLRv0's cmap+GSUB โ€” ~10ร— faster than nanoemoji's bitmap pass, and normalized to a clean 1-em advance. If a COLRv0 build ever overflows TrueType's 65 535-glyph cap it drops the least-common emoji (multi-person skin-tone sequences first) until it fits โ€” which is also why gradient-heavy CBDT sets (Noto, Blobmoji) ship sbix only. OpenMoji ships its own prebuilt sbix / COLRv0 / OT-SVG upstream, so those are downloaded directly (sbix gets box-glyf added). ยฒ Fluent's art is Microsoft's fluentui-emoji (MIT); the color builds come from tetunori's webfont, which is the upstream this action tracks.

See VERSIONS.md for each font's detected Unicode Emoji version.

Automation

  • Per-action weekly (build-<action>.yml, staggered Mondays): each compares its upstream's latest commit to versions/<action>.json and rebuilds only if that upstream changed, publishing every font it produces to the rolling latest pre-release. Run any one individually (Actions โ†’ โ†’ Run workflow). Shared logic lives in the reusable _build.yml.
  • Docs (docs.yml): single writer of VERSIONS.md, triggered after each build (and weekly), regenerating it from versions/*.json.
  • Monthly (release.yml, 1st): snapshots latest into a dated YYYY.MM release.

Build locally

scripts/build.sh twemoji      # build one font's variants โ†’ dist/
scripts/build.sh fluent       # โ†’ fluent.ttf (3D), fluent-flat.ttf
python build_noto.py build    # each font has its own one-line generation script
python build_noto.py changed  # print the action iff its upstream changed
python common.py build-all    # everything ยท common.py holds the shared build code

Each font names a builder in sources.json, so its pipeline is explicit and tuned to its source:

Builder Used by What it does
cbdt_sbix Noto, Blobmoji, Fluent 3D lift CBDT bitmaps into an sbix strike (centred on the em) + box glyf; + OT-SVG if the set has SVGs (Noto, Blobmoji)
otsvg Fluent Flat keep the source webfont's vector OT-SVG, drop the bitmap/COLRv1 tables macOS can't render
svg_mono Fluent (monochrome) a true monochrome glyf font (renders in the text colour) via nanoemoji's mono glyf, from MS's High-Contrast SVGs
download Toss Face, mono Noto, OpenMoji take the upstream font as-is (+ optional box glyf / prebuilt COLRv0 / prebuilt OT-SVG)
svg_color Twemoji, EmojiTwo COLRv0 + OT-SVG via nanoemoji (normalized); sbix via resvg over its cmap+GSUB

The shared build code is in common.py (BUILDERS registry); each font has a one-line generation script build_<font>.py that calls it.

About

macOS-renderable color emoji fonts (sbix/COLRv0), auto-built from upstream weekly

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages