Not too long ago, I released version 2.0 of my collection of tweaked fonts, and I was pretty sure I was done tweaking fonts for the rest of the year.
However, this morning I received a message in my inbox from a friendly person who linked me to an interesting post on the MobileRead forums and noted:
One suggestion would be to consider adding ‘old-style’ kern tables so that kerning works correctly when reading
kepubfiles: see e.g. link.
Okay, that’s cool. Kerning is notoriously bad on Kobo’s kepub renderer, so perhaps it was possible to re-export my fonts and improve them even further?
The email continued:
I’ve had some luck in the past with getting fonts to kern correctly on Kobo by just using Fontforge and exporting them with old-style kerning tables enables.
So, I gave it a try and exported my go-to option, Charter. Modern fonts use a so-called GPOS table. That’s the abbreviated version of glyph positioning table – and it’s a fairly modern feature.
The GPOS table is used to store kern information in the font, and it’s a little more flexible than the old-style kern table. For example, you can specify various kern classes, which lets you map certain groups of glyphs together for kerning.
The GPOS table is, unfortunately, not used by the version of Qt that Kobo is built upon when fonts are rendered. Oops.
This may change in the future, but today we need to fix this by using the old-style kern table, which lacks a few features available via the GPOS table(s) and has a hard cap on the maximum amount of kern pairs we can add in a single font file.
Take a look at the results below, I’ve made an interactive component that toggles between both states:
Bad: Font exported without old-style kerning.
Good: Font exported with old-style kerning.
It’s obvious that the version with the old-style kern table actually seems to render differently… correctly, even! That’s great! I tried this approach with a few others fonts, and sure enough, things seem to be better this way.
If you’ve taken a look at the repository, you may have noticed that I’ve chosen to keep these fonts as distinct ones from the regular collection. This is done for two reasons:
- I want it to be obvious which fonts use Kobo-compatible old-style kerning.
- When using old-style kerning, fonts may not render correctly on other operating systems.
In particular, FontForge warns you about Windows when exporting only with old-style kerning.
There is another toggle you can use (Windows-compatible ‘kern’), but for some fonts this causes issues when exporting due to limitations in the kerning table.
As it turns out, there’s a maximum size that is reached and certain kerning info may be missing beyond a particular point.
If you want to have the best reading experience with your kepub books, using the Kobo-compatible fonts is now the way to go.
Enabling ligatures for kepub files
It is possible to tweak your Kobo device so it will render ligatures, even when using the kepub render. This means that certain ligatures, like fi or ff, will be displayed correctly.
To do this, you need to modify .kobo/Kobo/Kobo eReader.conf. You need to add an override for webkitTextRendering, but this WILL break justified text, so you will need to turn on left-aligned text, too.
[Reading]
webkitTextRendering=optimizeLegibility
I recommend turning this on unless you like reading justified text. You must fully restart your device, and now ligatures should render correctly.
Update
March 14, 2026
It should also be noted that setting webkitTextRendering to optimizeLegibility will also make it so that GPOS data is read correctly! This way you won’t need the legacy kern table.
But unless you added this setting, the vast majority of users will unfortunately not get proper kerning and ligatures unless the workaround with the old-style kern table is used, which is usually limited to about 10k kern pairs.
This was not generated: Unless explicitly specified, the posts on my blog are my own creative work. 100% written (typos included) and edited by me; not generated using e.g. large language models.

Comments
Nothing yet. Say the first thing.
Sign in to join the conversation.