Creating Readerly

11 min read Original article ↗

When I got back into reading in 2022 with my first steps into the Cosmere, I did not imagine that I would become a reading fiend and make my way through many books as the years have gone by.

I also ended up owning a bit of an e-reader collection. I’ve owned Kobo, Kindle and Boox devices over the years. My Kindle ownership was brief: after a couple of months, I sold the device but there was one thing that I thought was excellent on Amazon’s device – and that’s the fonts that shipped with the device.

I’ve written about the topic before, but Rakuten Kobo’s default fonts are not as good as they used to be. I understand that the licensing costs may have been a problem. Now that they ship a different selection of fonts with their devices, I think it’s fair to say their default type options are frankly not as good as Kindle’s, which ships with the likes of Caecilia, Palatino and most importantly, the excellent Bookerly.

Bookerly is © Dalton Maag Ltd., and licensed to Amazon. This image is for illustrative purposes only. This particular typeface sample has been sourced via Wikipedia.
Bookerly is © Dalton Maag Ltd., and licensed to Amazon. This image is for illustrative purposes only. This particular typeface sample has been sourced via Wikipedia.

I am aware that there’s a bunch of people who just download whatever fonts they want, but that’s not something you are legally supposed to do – licensing restrictions apply to commercial fonts (and typefaces). Bookerly is a serif typeface designed by Dalton Maag, and it’s exclusively licensed to Amazon.

A few years ago, Rakuten got a bunch of fonts made for their brand. It’s notable that these were also created in collaboration with Dalton Maag. As of the release of the Kobo Libra Color, Rakuten Serif is now the default font (superseding Georgia) for the digital reading experience.

This new default, Rakuten Serif sadly just isn’t that great if you prefer your fonts a little thicker – which is generally easier on the eyes on e-ink displays. To be fair, this is partially an issue of taste. I can see that some people really find it very crisp, and it’s definitely quite legible. However, as someone without perfect vision, I actually rather prefer a little bit more weight on my fonts.1

The most common open source license that does allow for modification, sharing, etc. is the Open Font License. Sadly, as I noted before, there’s no real similar alternative to Bookerly that currently exists that you can legally acquire and put on your e-reader.

I’ve maintained the ebook-fonts repository for quite a while now, and while I was preparing to update my curated selection for the upcoming “v3” release, I wanted to give Newsreader another go and see if I couldn’t put it in my core collection.

Unfortunately, Newsreader is quite beautiful but I found its stroke thickness less than ideal. The font is, however, interesting: when you look at the variable font features, you can modify two aspects of the font: the weight and the optical scale axis.

Optical sizes in a variable font are different versions of a typeface optimized for use at singular specific sizes, such as 14 pt or 144 pt. Small (or body) optical sizes tend to have less stroke contrast, more open and wider spacing, and a taller x-height than those of their large (or display) counterparts.

If you download Newsreader via Google Web Fonts, you will get the variable font, as well as some static size combinations.

When I looked at the different styles, I noticed that the 9pt optical version looked pretty good. It actually reminded me of Bookerly, but it was a little wider. That led me to first create “NV NinePoint”, a renamed version of Newsreader 9pt. (I know, a very creative choice.)2

I tried out NinePoint for a while, but I found it eerily reminiscent of Bookerly, in some aspects. So I wondered: how close can I get to the look and feel of Bookerly by altering this basis? I’d start from the basis of Newsreader and then do some transformations and see what looks optically the most interesting or readable.

Since I was going to optimize for e-readers, I decided that I’d bump the weight of the font by a little, too. Because it would be a very time consuming job to make these changes manually via FontForge’s UI, I decided to see if I couldn’t automate this process. Some tinkering was needed, but with the assistance of some LLMs, I was able to accomplish the task.

Then it was up to me to decide what font weights to use, and what transformations to apply. In order to get closer to the visual appeal of Bookerly, I wanted smaller uppercased letters, so those have been made a little shorter (or, well, the others have been made taller, to be more precise) so that the optical size is a little different.

This unfortunately means that certain lowercase characters may end up taller than certain tall capitals. While a little bit typographically dubious, I do also think it looks kind of interesting, so I’ve kept that modification in.

In order to best illustrate the difference between the original Newsreader and the altered version, I think this image properly illustrates what’s changed.

As you can see, all of the characters in Readerly are a bit condensed and a little taller, too, compared to Newsreader 9pt. I made sure to check if the weight looks good on e-readers.
As you can see, all of the characters in Readerly are a bit condensed and a little taller, too, compared to Newsreader 9pt. I made sure to check if the weight looks good on e-readers.

I’ve made it so that the line spacing on Readerly is fairly tight, so that you can customize it. I set up various variables that are configurable in the Python script should you want to make your own modifications. The defaults are as follows:

VARIANT_STYLES = [
    # (style_suffix, source_vf, wght, opsz)
    # opsz=9 is intentionally small to tighten letterforms
    ("Regular",    REGULAR_VF, 450, 9),
    ("Bold",       REGULAR_VF, 650, 9),
    ("Italic",     ITALIC_VF,  450, 9),
    ("BoldItalic", ITALIC_VF,  650, 9),
]

# Scale lowercase glyphs vertically (and slightly widen).
SCALE_LOWER_X = 1.03
SCALE_LOWER_Y = 1.08

# Condense all glyphs horizontally.
CONDENSE_X = 0.95

# Step 3: Vertical metrics + line spacing (relative to UPM)
# - LINE_HEIGHT drives OS/2 Typo metrics (default line spacing)
# - SELECTION_HEIGHT drives Win/hhea metrics (selection box + clipping)
# - ASCENDER_RATIO splits the total height between ascender/descender
LINE_HEIGHT = 1.0
SELECTION_HEIGHT = 1.3
ASCENDER_RATIO = 0.8

# Step 3: Naming and style metadata (used by the rename step)
STYLE_MAP = {
    "Regular":    ("Regular",     "Book", 400),
    "Bold":       ("Bold",        "Bold", 700),
    "Italic":     ("Italic",      "Book", 400),
    "BoldItalic": ("Bold Italic", "Bold", 700),
}

This was done because I was constantly customizing the scaling and font weights to try various different configurations. It took me a bit to get something that I liked. It was important that it didn’t look like the font was just distorted, which is always a risk when you apply this kind of scaling to glyphs without manual modifications.

I then proceeded to test the various iterations of the font on my devices. As an example, here’s what Readerly looks like on a Kobo device:

Readerly on a Kobo Libra Color, with the first page of Warbreaker displayed.
Readerly on a Kobo Libra Color, with the first page of Warbreaker displayed.

I bumped into a couple of issues, at first. Two in particular are worth documenting.

  1. First off, I noticed that certain glyphs did not render correctly on Kobo devices, and this is most likely due to the nature of the variable font and how the outlines were originally designed. Thankfully, simplifying the outlines is generally the fix for this particular issue.

  2. I also noticed that doing this caused some glyphs to be exported incorrectly. In particular, on macOS some glyphs (only a handful) would not render at all.3

It turns out that I needed to do a little bit of cleanup after outline simplification. I had to ask an LLM to help me out with that, and it was able to identify so-called “zero-area contours”, which I was able to remove as a final step of the build script.

Tweaks and modifications

Anyway, so here’s the key modifications in a list:

  • The regular (and italic) is based on the 450 weight, and 9 pt optical size.
  • The bold (and bold italic) is based on the 650 weight, and 9 pt optical size.
  • Lowercase glyphs are scaled to be 3% wider and 8% taller.
  • All glyphs are also condensed by 5% (so lowercase glyphs are 2% condensed).
  • Vertical metrics have been adjusted for a tighter line height.
  • Outlines have been simplified and zero-area contours after simplification have been removed.
  • The font has been renamed to Readerly, copyright information has been updated and the version number is distinct from Newsreader.

With this, I hope to have provided a potential decent alternative to Bookerly for most extended Latin scripts. This means that the font can be used for most Western European languages.

I should note that Newsreader does not come with support for Arabic, Armenian, Cyrilic, Greek, Greek, Hebrew or Hindi alphabets. As such, Readerly does not either.

If you need broad support for such other alphabets, you should look into other options, such as Noto or Charis.

I tried my best to create a similar image for Readerly, and this is what it looks like.
I tried my best to create a similar image for Readerly, and this is what it looks like.

Update

March 14, 2026

Readerly has received an update today that adds font hinting via ttfautohint, which makes it look significantly better on Kobo devices.

Without explicit font hinting, the font unfortunately didn’t look correct, with some glyphs seemingly “jumping up” due to how the renderer (likely FreeType) handles unhinted fonts.

Here’s a little demonstration video (without audio) that demonstrates the difference as I toggle between two layers in Affinity Photo.

Hopefully, you can see that initially, when the video starts, some of the glyphs seem to be a little off. In the initial picture, you can see that the u glyph seems to be moved 1 pixel up from the baseline, which gives the impression that the u and a characters aren’t correctly visually aligned.

This is especially noticeable on the actual e-readers – so the updated hinting does a better job at ensuring that all lowercase characters are visually identical in terms of height. Happy reading!

I’ve also set up an automatic pipeline for GitHub Actions that automatically generates a KF version of Readerly, which includes old-style kern pairs which is optimal for Kobo devices, this is accomplished with my Kobo Font Fix script.

Update

April 3, 2026

I have just released the latest collection of ebook-fonts and after lots of tweaking, version 1.5 of Readerly is included.

It’s pretty much as optimized for Kobo devices as it can be. For the absolute best reading experience, KOReader is recommended. You can also install it using KoboPatch WebUI.

As an aside, I’m currently working on using machine learning to automatically kern a slightly thicker version of Charter (more on that in a future blog post) and I also released Sourcerer, a slightly thicker version of Source Serif for e-readers.

Download

If you would like to download the font so you can use it on your e-reader, you have a few options.

  • Download the latest release for Kobo devices directly.
  • Download the latest release for other e-readers directly.
  • You also can find my curated collection here.
  • Alternatively, you can clone the Readerly repository and run build.py yourself. This lets you build your own tweaked version to your personal taste if you’d like to adjust some of the knobs in the script.

Installation

To install the font, please follow the instructions that apply to your e-reader or computer. For most devices, this means copying the TrueType font files, so make sure to unzip the archive first.

On Kobo devices, make sure to install the KF font files in the fonts folder on your KOBOeReader volume.

If you had a previous version of Readerly installed, also restart your device for the new version to be loaded.

A few notes

I do not wish to take a lot of credit for this. The original type designers from Production Type clearly put a lot of effort into Newsreader, and they deserve all of the cheers and appreciation for their hard work.

I just made a script that creates a modified font, and while I did spend a couple of hours getting things just right, I didn’t even do much manual work in FontForge this time (only exploratory work, which I then automated).

In order to comply with the OFL, I also wanted to make sure that I renamed the font from Newsreader to Readerly, since the former is a reserved name.