Make Inkscape's font dropdown show only fonts you have active in Font Book — instead of every .otf/.ttf on your Mac including Apple's 300+ language and decorative fonts (Devanagari MT, Kohinoor Devanagari, Kannada MN, PingFang, Osaka, Chalkboard, etc.) and its ~80 dot-prefixed hidden system fonts.
Inkscape on macOS uses Fontconfig, not the native CoreText / Font Book stack. Fontconfig scans font directories directly and doesn't know about Font Book's activation state, so every font on disk shows up in Inkscape's dropdown regardless of whether Font Book has it enabled. On a stock macOS install that means hundreds of fonts, most of which you don't use.
Compounding the problem: Inkscape.app's bundled Fontconfig has been hand-edited by its maintainer to strip standard user-include paths. So even if you write a ~/.config/fontconfig/fonts.conf, Inkscape.app never reads it. This is why "just add a fontconfig" doesn't work.
There's no way to make Inkscape honour Font Book directly — the two systems don't talk.
Three decoupled pieces working together:
- A Fontconfig config at
~/.config/fontconfig/fonts.confthat hides fonts from/System/Library/Fonts/Supplemental/,~/Library/Fonts/,/Library/Fonts/, and/Library/Application Support/Apple/Fonts/, AND rejects the ~80 dot-prefixed "hidden" macOS families (.CJK Symbols Fallback *,.SF Arabic,.LastResort,.Aqua Kana,.New York, etc. — Font Book hides these by the.prefix convention; Fontconfig has no such convention, hence the explicit list). Keeps/System/Library/Fonts/(base UI fonts minus the dot-hidden ones) and a curated dir~/InkscapeFonts/visible. - A sync script + launchd agent that populates
~/InkscapeFonts/with symlinks to every font currently active in Font Book. Fires at load and whenever Font Book's state or~/Library/Fonts/changes (throttled to once every 30 s). - A patch to
Inkscape.app's bundledfonts.confthat adds an<include>for~/.config/fontconfig/fonts.conf. Without this patch, the whole setup is a no-op from Inkscape.app's perspective (see problem section). The patch is lost on every Inkscape.app update — re-runinstall.shto re-apply.
Net result: Inkscape sees only the base OS UI fonts (~30, minus the dot-hidden ones) plus whatever Font Book has active. Toggle a font in Font Book → Inkscape's list updates within 30 s of the next launch. Expected fc-list totals drop from ~4700 to ~900; unique families from ~390 to ~310.
fonts.conf.template also contains a commented-out block of CSS-generic family aliases (sans-serif, serif, monospace, cursive, fantasy → real installed families, with multi-platform preference lineups). By default Fontconfig maps these generics to fonts in the noisy dirs we reject (Verdana, Times New Roman, etc.) — visible on-canvas but flagged with a
To enable: after install, edit ~/.config/fontconfig/fonts.conf and remove the <!-- / --> wrappers around the alias block. See the block's header comment for the caveat (Inkscape still shows "sans-serif" verbatim in the font field for objects that use the CSS generic — that's a picker UI thing).
- macOS 13+ (tested on Tahoe 26.6.1; Font Book state must live at
~/Library/Containers/com.apple.FontBook/Data/Library/Preferences/com.apple.FontBook.plist— sandboxed Font Book) jq(Apple ships one at/usr/bin/jqsince macOS 15; earlier:brew install jq)fontconfig(Homebrew:brew install fontconfig)python3(Apple ships one at/usr/bin/python3) — used byinstall.shfor the Inkscape.app fonts.conf patch- Inkscape.app (official DMG) or Homebrew Inkscape — both use Fontconfig
git clone https://gist.github.com/micschk/8c3c3b38a91283f674429073e342233a.git inkscape-font-sync
cd inkscape-font-sync
./install.shOr download the files individually from the gist page and run ./install.sh.
The installer:
- Verifies prerequisites (
jq,fc-cache,fc-list) - Creates
~/.config/fontconfig/,~/bin/,~/InkscapeFonts/,~/Library/LaunchAgents/ - Enumerates the dot-hidden macOS family list from
fc-list(per your macOS version) - Renders
fonts.conf.template→~/.config/fontconfig/fonts.confwith the hidden-family reject block embedded - Installs
sync-inkscape-fonts.shandlocal.inkscape-font-sync.plist(renders__HOME__to your actual home path) - Patches
/Applications/Inkscape.app/Contents/Resources/etc/fonts/fonts.confto include your user config (backup saved as.orig-before-inkscape-font-sync) - Clears Inkscape's font cache so it re-reads on next launch
- Runs the first sync manually (~15 s)
- Bootstraps the launchd agent
Fully quit Inkscape (⌘Q) and relaunch — Inkscape caches its font list on launch and won't pick up the change otherwise.
# 1. Fontconfig config — splice the dot-hidden family list from your local macOS
mkdir -p ~/.config/fontconfig
hidden=$(fc-list : family | tr ',' '\n' | sed 's/^[[:space:]]*//' | sort -u | grep '^\.' \
| awk '{printf " <pattern><patelt name=\"family\"><string>%s</string></patelt></pattern>\n", $0}')
awk -v repl="$hidden" '{gsub(/__HIDDEN_FAMILIES__/, repl); print}' fonts.conf.template \
> ~/.config/fontconfig/fonts.conf
# 2. Sync script
mkdir -p ~/bin ~/InkscapeFonts
cp sync-inkscape-fonts.sh ~/bin/
chmod +x ~/bin/sync-inkscape-fonts.sh
# 3. Launchd agent — substitute your home path
sed "s|__HOME__|$HOME|g" local.inkscape-font-sync.plist \
> ~/Library/LaunchAgents/local.inkscape-font-sync.plist
# 4. Patch Inkscape.app's bundled fontconfig to include our user config
INKCONF=/Applications/Inkscape.app/Contents/Resources/etc/fonts/fonts.conf
cp -n "$INKCONF" "$INKCONF.orig-before-inkscape-font-sync"
python3 -c "
import re
src = open('$INKCONF').read()
patch = '\n\t<include ignore_missing=\"yes\">~/.config/fontconfig/fonts.conf</include>\n'
open('$INKCONF','w').write(re.sub(r'(<include ignore_missing=\"yes\">conf\.d</include>\n)', r'\1'+patch, src, count=1))
"
# 5. Nuke Inkscape's font cache
rm -rf ~/Library/Caches/org.inkscape.Inkscape/fontconfig/*
# 6. First sync + bootstrap the agent
~/bin/sync-inkscape-fonts.sh
launchctl bootstrap "gui/$(id -u)" ~/Library/LaunchAgents/local.inkscape-font-sync.plistmacOS will show a background-activity notification for sync-inkscape-fonts.sh; grant it "Allow in the Background" under System Settings → General → Login Items & Extensions.
# What's Fontconfig seeing?
fc-list | wc -l
# Any dot-hidden families still visible? Should be 0.
fc-list : family | tr ',' '\n' | sed 's/^[[:space:]]*//' | sort -u | grep -c '^\.'
# What's in the curated dir?
ls ~/InkscapeFonts | wc -l
# What do the CSS generics resolve to now?
for g in sans-serif serif monospace cursive fantasy; do
printf "%-11s → " "$g"; fc-match "$g"
done
# Agent state
launchctl print "gui/$(id -u)/local.inkscape-font-sync"
# Log tail
tail -f ~/Library/Logs/sync-inkscape-fonts.log- Enable/disable fonts in Font Book normally. The launchd agent detects the Font Book plist change (within 30 s) and resyncs
~/InkscapeFonts/. Restart Inkscape to pick up the new list. - Force a font into Inkscape independent of Font Book state: drop the real
.otffile (or a manual symlink) into~/InkscapeFonts/. The sync script only manages symlinks — any real file there survives every resync. - Manual resync:
~/bin/sync-inkscape-fonts.sh(takes ~15 s — the sync usessystem_profilerwhich walks every font on the system). - Uninstall:
./install.sh --uninstall(reverts the Inkscape.app patch from backup, unloads the agent, removes the files).
Re-run ./install.sh after:
- An Inkscape.app update — Inkscape overwrites its bundled
fonts.conf, wiping our<include>patch. The installer is idempotent and will re-patch. - A macOS major update — Apple may add or remove dot-hidden font families. The installer regenerates the reject list from
fc-list, so the updated set is picked up.
Edit ~/.config/fontconfig/fonts.conf if:
- You want to enable the CSS-generic family aliases — remove the
<!--/-->wrappers around the alias block near the end of the file. Fontconfig will then mapsans-serif/serif/monospace/cursive/fantasyto specific fonts (Helvetica Neue, Georgia, Menlo, Apple Chancery, Impact by default). Trim/reorder the preference lineups to taste. - You want
/System/Library/Fonts/(base) hidden too — add<glob>/System/Library/Fonts/*</glob>to the reject list. Warning: this may break Inkscape's UI text rendering if it loses its fallback fonts. - You want a different curated dir — change
~/InkscapeFontsin both the<dir>element AND the<acceptfont><glob>, and updatesync-inkscape-fonts.sh(DEST) + the plist (WatchPathsand hardcoded paths).
Edit ~/Library/LaunchAgents/local.inkscape-font-sync.plist if:
- You want a different throttle window (
ThrottleInterval) - You want to watch different paths (
WatchPaths)
After any plist change: launchctl bootout gui/$(id -u)/local.inkscape-font-sync && launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/local.inkscape-font-sync.plist.
- Inkscape has its own font-list cache and only refreshes on launch. A full quit (⌘Q) + relaunch is required after the sync updates the set (or after enabling the CSS aliases).
- The bundled Fontconfig inside
Inkscape.appstrips user-include paths — patched byinstall.sh, but the patch is lost on every Inkscape update. Re-runinstall.shafter each update. Homebrew Inkscape's config is normal Fontconfig and reads~/.config/fontconfig/fonts.confautomatically. system_profiler SPFontsDataTypeis slow (~10-30 s). The launchdThrottleInterval: 30prevents burst-firing.- The
system_profilerJSON schema could drift on future macOS updates. If the sync suddenly reports 0 fonts, inspect one entry withsystem_profiler -json SPFontsDataType | jq '.SPFontsDataType[0]'and adjust thejqfilter in the script. - Inkscape's font picker still shows
sans-serif/serif/ etc. verbatim for text objects that use those CSS generics (with a strikethrough +⚠️ icon). That's Inkscape flagging the generic as "not a specific installed family." To make new text default to a real family:Edit → Preferences → Tools → Textand set the default font family. The optional CSS-generic aliases infonts.confcontrol what those generics render as, but don't change what the picker displays.
| File | Installs to |
|---|---|
fonts.conf.template |
~/.config/fontconfig/fonts.conf (with __HIDDEN_FAMILIES__ rendered from local fc-list at install time; CSS-generic aliases included commented-out for opt-in) |
sync-inkscape-fonts.sh |
~/bin/sync-inkscape-fonts.sh (executable) |
local.inkscape-font-sync.plist |
~/Library/LaunchAgents/local.inkscape-font-sync.plist (__HOME__ substituted at install time) |
| — | Also patches /Applications/Inkscape.app/Contents/Resources/etc/fonts/fonts.conf (backup saved as .orig-before-inkscape-font-sync) |
install.sh |
(run once, not installed) |
README.md |
(this) |
Public domain / do what you like. No warranty.