Skip to content

Kdenlive AppImage

Install the AppImage

Download the AppImage from the KDENLive website in your home directory ~/lib/kdenline/ for example.

When there are font issues (timeline time) follow the 'Font Rendering Problem & Fix' section.

Font Rendering Problem & Fix

The file involved

56-kubuntu-noto.conf is a system-wide fontconfig configuration file, normally installed at /etc/fonts/conf.d/56-kubuntu-noto.conf on Kubuntu. It tells the font system which actual font files should be used whenever an application asks for a generic family such as serif, sans-serif, monospace, or ui-sans.

It is not a Kdenlive-specific file — every application on the system reads it, including AppImages, which bundle their own Qt/fontconfig runtime and are therefore more sensitive to certain configuration mistakes than a normal system application would be.

What's actually wrong

Inside the file, each generic family has an <alias><prefer> list: an ordered list of concrete font families fontconfig should try, in order, whenever it needs to draw a glyph in that generic family.

In the original file, Noto Color Emoji is listed first in all four of these lists (serif, sans-serif, monospace, ui-sans):

<prefer>
    <family>Noto Color Emoji</family>
    <family>Tinos</family>
    <family>Noto Serif</family>
    ...
</prefer>

Fontconfig walks the list in order and uses the first font in the list that contains the requested glyph. The problem is that Noto Color Emoji isn't limited to emoji — it also contains glyphs for plain digits, punctuation, and a number of common symbols. Because it's first in line, it wins the match for those characters too, instead of only being used for genuine emoji.

The practical effect: ordinary text — numbers, punctuation, certain symbols in menus, title clips, timeline labels, etc. — gets rendered using the emoji font's glyphs instead of the intended serif/sans/monospace font, producing noticeably wrong-looking or garbled text.

This is a documented upstream bug, not something specific to this system or to Kdenlive: it's tracked as Launchpad bug #1872492 against the kubuntu-settings package, where it was first reported breaking font rendering in Firefox on several major websites. It affects any Chromium/Electron/Qt-based application on Kubuntu, and AppImages are particularly exposed because their bundled font/rendering stack resolves the same misconfiguration slightly differently than the system browser does — which is why it shows up so visibly in Kdenlive.

The fix

The upstream-recommended fix is simple and non-destructive: move Noto Color Emoji to the end of each <prefer> list instead of the beginning.

<prefer>
    <family>Tinos</family>
    <family>Noto Serif</family>
    ...
    <family>Noto Color Emoji</family>
</prefer>

This keeps the emoji font fully available as a fallback for actual emoji characters (nothing else in the list can render them), while making sure it's only consulted after every real serif/sans/monospace font has already had a chance to supply the glyph. Ordinary text goes back to using the fonts it was always meant to use; emoji still render correctly.

The change is applied identically in all four blocks:

  • serif
  • sans-serif
  • monospace
  • ui-sans

Nothing else in the file is touched — the CJK minimum pixel size rule, the Symbola handling, and all the hinting/anti-aliasing rules for CJK and Indic/Southeast-Asian scripts are left exactly as they were.

Follow-up issue: only some emoji render in color

After applying the fix above, you may notice that Kdenlive renders only a handful of glyphs in full color, while most emoji-looking characters still show up in plain black-and-white — even though a terminal application (e.g. joe in the same console) shows all of them in color.

This comes down to fontconfig having two different mechanisms for choosing a color emoji font:

  1. The ordered <prefer> list (what we just fixed). This is a simple, dumb fallback: for a requested generic family, use the first font in the list that contains a glyph for the character. It has no notion of "this character is supposed to be an emoji" — it just checks glyph coverage.
  2. A language-tag–based override. Modern text-shaping engines can tag a character as language und-zsye ("undetermined script, emoji") when it recognizes the character as a genuine emoji-presentation sequence. Fontconfig ships a companion rule (normally in 60-generic.conf / 45-generic.conf) that forces such characters to a color emoji font with a strong binding — overriding any ordering in the <prefer> lists entirely.

The problem: many common symbol characters (★, ☺, ✓, arrows, card suits, weather symbols, …) exist as plain monochrome glyphs in Noto Sans Symbols, Noto Sans Symbols2, and DejaVu Sans — fonts that sit earlier than Noto Color Emoji in the <prefer> lists we just fixed. Mechanism #1 finds those monochrome glyphs first and stops there. Only a character with no match anywhere earlier in the list falls all the way through to Noto Color Emoji — which is why just one glyph showed up in color.

Your terminal isn't affected because terminal emulators generally implement their own emoji-aware font substitution independent of this file, so this ordering quirk never comes into play there.

The fix: add the standard und-zsye strong-binding rule directly to this file, near the top, before the <alias> blocks:

<match target="pattern">
    <test name="lang">
        <string>und-zsye</string>
    </test>
    <edit name="family" mode="prepend" binding="strong">
        <string>Noto Color Emoji</string>
    </edit>
</match>

This only affects characters the shaping engine actually tags as emoji, so it doesn't undo the earlier fix — plain text and ordinary (non-emoji) symbol glyphs keep using the monochrome serif/sans/symbol fonts exactly as before.

Caveat: whether this fully solves it inside Kdenlive's AppImage specifically depends on whether the bundled Qt/text-shaping stack inside the AppImage actually tags characters with und-zsye in the first place — older bundled Qt versions may not implement full Unicode emoji-sequence detection, in which case this rule (which only affects apps that do the tagging) won't change anything for that particular app, even though it's still correct and harmless to have in place.

Practical workaround inside Kdenlive itself: in the Title Clip tool, you can explicitly select Noto Color Emoji as the font for the specific character (s) you want colored. Naming a font directly is a strong binding that bypasses the generic-family <prefer> mechanism entirely, so any glyph that font contains will render in color regardless of the issue above.

Follow-up: Konsole lost some color emoji after the fix

After applying the reordering fix, you may notice the opposite problem shows up in Konsole: most emoji/symbol glyphs at the bare shell prompt now render monochrome, where before the fix they were all in color.

This is an expected side effect of the same trade-off, not a new bug:

  • Konsole draws ordinary text directly from whichever font is set in its Profile settings, so plain letters/digits/punctuation never touch the <alias>/<prefer> lists at all.
  • But when a character is missing from that font (real emoji, dingbats, symbols), Konsole falls back to fontconfig's broader glyph search, which is influenced by the <prefer> ordering.
  • Before the fix, Noto Color Emoji was first, so it won almost every fallback lookup, and everything appeared colorful.
  • After the fix, monochrome symbol fonts (Noto Sans Symbols, Noto Sans Symbols2, DejaVu Sans Mono) — which contain black-and-white versions of many of the same codepoints — now win first, and only a glyph absent from all of them falls through to the color font.

Kdenlive's bundled Qt (6.9+) mostly self-corrects this via its own Unicode-based emoji detection, independent of fontconfig ordering — Kubuntu 24.04's Konsole predates that and is fully exposed to the ordering trade-off.

Fix: a small, separate drop-in file (70-konsole-color-emoji.conf) that scopes "always prefer the color emoji font" to Konsole specifically, using a prgname match, so it doesn't reopen the original bug for any other application:

Content of file ~/.config/fontconfig/conf.d/70-konsole-color-emoji.conf:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<!--
  Restores "always prefer the color emoji font" behavior, but scoped only
  to Konsole, so it doesn't reintroduce the bug that 56-kubuntu-noto.conf's
  fix addresses for every other application (regular digits/punctuation
  being hijacked by Noto Color Emoji).

  Konsole draws its normal text directly from the font set in its Profile
  settings, so this rule only affects glyphs missing from that font
  (symbols/emoji used as a fallback) - it will not affect plain text.
-->
<fontconfig>
    <match target="pattern">
        <test name="prgname">
            <string>konsole</string>
        </test>
        <edit name="family" mode="prepend" binding="strong">
            <string>Noto Color Emoji</string>
        </edit>
    </match>
</fontconfig>

Since Konsole's ordinary text bypasses the <prefer> lists entirely (it's drawn from the explicitly configured profile font), this only affects the fallback glyphs — it's safe and won't corrupt plain text the way the original, file-wide Noto Color Emoji-first ordering did.

Install as a user-level override (no root required):

mkdir -p ~/.config/fontconfig/conf.d
cp 70-konsole-color-emoji.conf ~/.config/fontconfig/conf.d/
fc-cache -f

Then fully quit Konsole (check ps aux | grep konsole — closing a tab isn't always enough) and reopen it. To cover other terminal emulators, add more <string> entries inside the same <test name="prgname"> block, or duplicate the <match> block with a different program name.

No-root alternative: fixing Kdenlive without touching /etc/fonts

Everything above assumes editing the root-owned system file /etc/fonts/conf.d/56-kubuntu-noto.conf. If you'd rather not use sudo at all, the same fix can be applied entirely at the user level, and it's equally effective for Kdenlive (confirmed by testing the actual fontconfig substitution logic, not just by inspection):

50-noto-color-emoji-user-fix.conf re-declares the same four generic families (serif, sans-serif, monospace, ui-sans) with a mode="assign_replace" edit — this runs after the system file's <alias> already put Noto Color Emoji first, and fully overwrites the resulting family list with the corrected order (emoji last). Because user-level fontconfig files (~/.config/fontconfig/conf.d/) are always loaded after the system's /etc/fonts/conf.d/, this cleanly overrides the broken ordering without ever needing write access to /etc/fonts.

A caveat worth noting, found the hard way: the obvious-looking approach of "delete the existing Noto Color Emoji entry, then append it at the end" (mode="delete" followed by mode="append" with the same value) looks correct but silently does nothing — fontconfig internally deduplicates family values within a single substitution pass, so re-adding a value it just removed is a no-op. assign_replace (fully replacing the list in one edit) is what actually works; this was verified directly against the installed fontconfig library rather than assumed.

Install (no root required):

mkdir -p ~/.config/fontconfig/conf.d
cp 50-noto-color-emoji-user-fix.conf ~/.config/fontconfig/conf.d/
fc-cache -f

Then fully quit and relaunch Kdenlive (check the AppImage process is actually gone, not just the window).

This is a complete alternative to patching the system file — you don't need to do both. If you've already applied the root-owned patch, adding this file too is harmless (it just re-confirms the same already-correct order).

If you also use the Konsole fix (70-konsole-color-emoji.conf) from earlier, keep both files in ~/.config/fontconfig/conf.d/ together — the filenames matter here: 50-... loads before 70-..., so the general fix applies first and the Konsole-specific override applies afterward and wins for Konsole specifically, while every other application keeps the corrected (emoji-last) order. This load-order interaction was also verified directly.

Refresh the font cache afterward and fully restart Kdenlive:

sudo fc-cache -f

Content of file ~/.config/fontconfig/conf.d/50-noto-color-emoji-user-fix.conf:

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<!--
  User-level, no-root fix for the Noto-Color-Emoji-first ordering bug in
  56-kubuntu-noto.conf (Launchpad #1872492). Fully replaces the family list
  fontconfig builds for each of these four generic families after the system
  alias has already run, moving Noto Color Emoji to the end so it only acts
  as a last-resort fallback instead of hijacking ordinary text glyphs.

  Install with: mkdir -p ~/.config/fontconfig/conf.d && cp this file there,
  then fc-cache -f and fully restart the affected application.
-->
<fontconfig>
    <match target="pattern">
        <test name="family" compare="eq">
            <string>serif</string>
        </test>
        <edit name="family" mode="assign_replace" binding="same">
            <string>Tinos</string>
            <string>Noto Serif</string>
            <string>Noto Serif CJK SC</string>
            <string>Noto Naskh Arabic</string>
            <string>Noto Serif Thai</string>
            <string>Noto Serif Armenian</string>
            <string>Noto Serif Georgian</string>
            <string>Noto Serif Devanagari</string>
            <string>Noto Serif Hebrew</string>
            <string>Noto Serif Bangali</string>
            <string>Noto Serif Gujarati</string>
            <string>Noto Serif Kannada</string>
            <string>Noto Serif Malayalam</string>
            <string>Noto Serif Tamil</string>
            <string>Noto Serif Telugu</string>
            <string>Lohit Punjabi</string>
            <string>Lohit Oriya</string>
            <string>Noto Serif Khmer</string>
            <string>Noto Serif Lao</string>
            <string>Noto Serif Ethiopic</string>
            <string>Noto Serif Myanmar</string>
            <string>Noto Serif Sinhala</string>
            <string>Jomolhari</string>
            <string>Noto Sans Symbols</string>
            <string>Noto Sans Symbols2</string>
            <string>DejaVu Serif</string>
            <string>Noto Color Emoji</string>
            <string>serif</string>
        </edit>
    </match>
    <match target="pattern">
        <test name="family" compare="eq">
            <string>sans-serif</string>
        </test>
        <edit name="family" mode="assign_replace" binding="same">
            <string>Arimo</string>
            <string>Noto Sans</string>
            <string>Noto Sans CJK SC</string>
            <string>Noto Sans Arabic</string>
            <string>Noto Sans Thai</string>
            <string>Noto Sans Devanagari</string>
            <string>Noto Sans Tamil</string>
            <string>Noto Sans Hebrew</string>
            <string>Noto Sans Bengali</string>
            <string>Noto Sans Telugu</string>
            <string>Noto Sans Kannada</string>
            <string>Noto Sans Malayalam</string>
            <string>Noto Sans Gurmukhi</string>
            <string>Noto Sans Gujarati</string>
            <string>Noto Sans Oriya</string>
            <string>Noto Sans Armenian</string>
            <string>Noto Sans Georgian</string>
            <string>Noto Sans Khmer</string>
            <string>Noto Sans Lao</string>
            <string>Noto Sans Ethiopic</string>
            <string>Noto Sans Myanmar</string>
            <string>Noto Sans Sinhala</string>
            <string>Jomolhari</string>
            <string>Noto Sans Coptic</string>
            <string>Noto Sans Deseret</string>
            <string>Noto Sans TaiTham</string>
            <string>Noto Sans CanadianAboriginal</string>
            <string>Noto Sans Yi</string>
            <string>Noto Sans Tifinagh</string>
            <string>Noto Sans Adlam</string>
            <string>Noto Sans Cherokee</string>
            <string>Noto Sans Chakma</string>
            <string>Noto Sans Osage</string>
            <string>Noto Sans Symbols</string>
            <string>Noto Sans Symbols2</string>
            <string>DejaVu Sans</string>
            <string>Noto Color Emoji</string>
            <string>sans-serif</string>
        </edit>
    </match>
    <match target="pattern">
        <test name="family" compare="eq">
            <string>monospace</string>
        </test>
        <edit name="family" mode="assign_replace" binding="same">
            <string>Cousine</string>
            <string>Noto Sans Mono</string>
            <string>Noto Sans Mono CJK SC</string>
            <string>Noto Naskh Arabic</string>
            <string>Noto Sans Thai</string>
            <string>Noto Sans Devanagari</string>
            <string>Noto Sans Tamil</string>
            <string>Noto Sans Bengali</string>
            <string>Noto Sans Telugu</string>
            <string>Noto Sans Kannada</string>
            <string>Noto Sans Malayalam</string>
            <string>Noto Sans Gurmukhi</string>
            <string>Noto Sans Gujarati</string>
            <string>Noto Sans Oriya</string>
            <string>Noto Sans Armenian</string>
            <string>Noto Sans Georgian</string>
            <string>Noto Sans Ethiopic</string>
            <string>Noto Sans Myanmar</string>
            <string>Noto Sans Sinhala</string>
            <string>Noto Sans Tibetan</string>
            <string>Noto Sans Coptic</string>
            <string>Noto Sans Deseret</string>
            <string>Noto Sans TaiTham</string>
            <string>Noto Sans Cherokee</string>
            <string>Noto Sans Chakma</string>
            <string>Noto Sans Osage</string>
            <string>Noto Sans Symbols</string>
            <string>Noto Sans Symbols2</string>
            <string>Droid Sans Fallback</string>
            <string>DejaVu Sans Mono</string>
            <string>Noto Color Emoji</string>
            <string>monospace</string>
        </edit>
    </match>
    <match target="pattern">
        <test name="family" compare="eq">
            <string>ui-sans</string>
        </test>
        <edit name="family" mode="assign_replace" binding="same">
            <string>Noto Sans UI</string>
            <string>Noto Sans CJK SC</string>
            <string>Noto Naskh Arabic UI</string>
            <string>Noto Sans Thai UI</string>
            <string>Noto Sans Devanagari UI</string>
            <string>Noto Sans Tamil UI</string>
            <string>Noto Sans Hebrew</string>
            <string>Noto Sans Bengali UI</string>
            <string>Noto Sans Telugu UI</string>
            <string>Noto Sans Kannada UI</string>
            <string>Noto Sans Malayalam UI</string>
            <string>Noto Sans Gurmukhi UI</string>
            <string>Noto Sans Gujarati UI</string>
            <string>Noto Sans Oriya UI</string>
            <string>Noto Sans Armenian</string>
            <string>Noto Sans Georgian</string>
            <string>Noto Sans Khmer UI</string>
            <string>Noto Sans Lao UI</string>
            <string>Noto Sans Ethiopic</string>
            <string>Noto Sans Myanmar UI</string>
            <string>Noto Symbols</string>
            <string>Droid Sans Fallback</string>
            <string>DejaVu Sans</string>
            <string>Noto Color Emoji</string>
            <string>ui-sans</string>
        </edit>
    </match>
</fontconfig>