141 comments

[ 3.2 ms ] story [ 208 ms ] thread
Just this morning I have been working on a font rasterizer for an eink screen project. So it’s really interesting to see one this small.
if you're in the market for something slightly bigger, I've found this font to be useful on lowish-res (640x480) displays: https://github.com/josuah/miniwi
The size of the characters in pixels is not given in their readme, nor could I find it easily in the config files. Can you tell me how big the characters in its readme are?
looks like 3x5, or 4x8 if you include the whitespace
The lowercase "s" is only 4 px tall. The "f" and "y" add 2 px above and below, so the total reserved height must be 8px. Then 2 more px for whitespace, so 10.
It's a 4x8 grid, like I said. https://lukeshu.com/dump/miniwi-grid.png

Weird that the lowercase letters with ascenders are taller than normal uppercase, I didn't notice that. But yeah, the core numbers+uppercase box is 3x5 (with only "Q" violating that). And it's all on a 4x8 grid.

Readable is a very strong word
They're really stretching the definition of readable.
Yes but their bar is “readable” not “very readable by all without effort,” so I’m not sure why y’all find this so usage so objectionable. Yeah it wasn’t easy but I was definitely able to read the example text on my phone as-is/without zooming or anything.
Meh in that case even a barcode is 'readable'.
The upper case letters are fine (impressive, considering the resolution), but there's no way I could read the lower case if I didn't already know the text.
Same for me! I could definitely understand the upper case text at 100% resolution on a 24" 1080p screen. The lower case text was terrible and nearly unreadable.
I was able to read the lower case on a 6.7” ~2.8k smartphone screen. I imagine they don’t expect literally every person to be able to read it on every machine. This feels rather nitpick-y.
But did you read it after reading the upper case? And are you an American?

It's the same text as the upper case version and it's the Declaration of Independence, which a lot of us know pretty well. I initially tricked myself into believing that I could read it until I got past the part that I knew well, at which point I realized that I wasn't reading it so much as using the shapes as a mnemonic to help remember it.

(As an aside, it's not nitpicky to say "I can't read this font that bills itself as the smallest readable font", it's just an expression of doubt as to the advertised qualities of the font.)

On a 6.7" display, assuming 16:9, the screen is 5.8" wide. With 2.8k pixels across each pixel is 0.002 inches wide. I'm pretty sure you aren't viewing it at 100% resolution on the phone as each glyph would render as a nearly invisible dot.
(comment deleted)
This brings back some memories, but my eyesight is worse than it was 50 years ago, so no.
Like some in-game text/graphic from my 8-bit days. I was a big Tau Ceti/Academy player.
I can finally have 85 characters by 48 characters on my Sinclair ZX81, and it'd be printable, too, on my T/S 2040 printer.

(starts thinking in Z80...)

Which leads to the question: what is the smallest Z80 assembly function which takes an ASCII code as an input and returns one of these characters some way? 3x4 is 12 bits so with a little waste one can fit it into a 16 bit register pair. You could thus encode it into a 96*2=192 byte lookup table but isn't there some procedural generation to shrink that?
I believe a table and a lookup function would be smaller than a function for generating bitmaps: just for a single pixel I've got this expression [1].

  [1]: not(c0) and not(c2) and c3 and not(c4) and c5 and not(c6) or not(c0) and c2 and c3 and not(c4) and c5 and c6 or c0 and c2 and not(c3) and c4 and not(c5) and c6 or c0 and not(c1) and c2 and c3 and c4 and c6 or c0 and c1 and not(c2) and c3 and c4 and c6 or not(c1) and not(c3) and not(c4) and c5 and c6 or not(c2) and c3 and c4 and not(c5) and not(c6) or not(c0) and c1 and not(c3) and c5 and not(c6) or not(c0) and c1 and not(c2) and not(c3) and c4 or not(c0) and c1 and c3 and not(c4) and c5 or c1 and c3 and not(c4) and c5 and c6 or c1 and c2 and c4 and not(c5) and not(c6) or c0 and not(c1) and not(c4) and c5 and not(c6) or c0 and not(c2) and not(c4) and c5 and c6 or c0 and c1 and not(c3) and c5 and c6 or not(c0) and not(c1) and c4 and not(c5)
Nah, I am thinking like half a table and half some tricks to generate ... back in the day people were doing crazy crafty tricks to squeeze the most out of the rather limited memory of the machines.
Oops. It's 3x4 inside of a 4x5 box, meaning a Sinclair ZX81 can only do 64 x 38 :(
In my experience you get a lot of density moving to a variable-width font, which is quite easy to write for a Z80 system. For example I've designed a couple with the horizontal size in the first byte of the bitmap:

https://github.com/Veltas/spectrum-env/blob/master/font-orig...

https://github.com/Veltas/spectrum-env/blob/master/font-smal...

Rendering:

https://github.com/Veltas/spectrum-env/blob/master/text.asm#...

Looking back at it, my Z80 for this isn't that good, but it was still fast enough to redraw a whole line of text in 1 or 2 frames, I'm sure others can do better.

If you're interested in other tiny fonts:

- PICO-8's 3x5 font with support for programming characters: https://www.lexaloffle.com/pico-8.php?page=faq

- Ken Perlin has an RGB stripe subpixel font. Unfortunately, the original page uses Java so I can't access it, but https://www.fastcompany.com/1662778/the-worlds-smallest-legi... has more info.

- Dotsies if you're willing to try very strange encodings: https://dotsies.org/

- https://news.ycombinator.com/item?id=33127419 has more examples.

(comment deleted)
3x4 = 12 bits

52 upper/lower case letters + 10 numerals ≈ 64 = 6 bits

It's kind of amazing that the overhead is only a factor of 2 to literally read BINARY data with my eyes.

And that a 1bpp uncompressed image of a piece of text can be only 50% larger in file size than its .txt file and be readable.

Readability is in your own eyes.

What it is readable for you, is not for me.

Just map lower case to uppercase and replace any non alpha-num to a black square. This font is not for general use but just to squeeze text messages on tiny displays.

TBH, I see all this pretty useless. While still interesting enough.

Does this mean that ASCII / the Latin alphabet, is actually pretty good :-)
obviously 8x8 is comparably enormous but https://damieng.com/typography/zx-origins/ has a great collection of fonts
Theres also the wonderful "Arcade Game Typography: The Art of Pixel Type" by Toshi Omigari which has pages and pages of fonts used in arcade games, sorted by style, most of which are 8x8
I'm glad you linked to one with subpixel rendering.

Considering that when we view text on a modern display we're almost always seeing anti-aliased grayscale pixels with subpixel rendering, it doesn't make sense to me that you'd design a font that doesn't take advantage of that.

Why not even grayscale? Surely a few of the letters could be improved by using a pixel other than pure black or pure white?

Uppercase is impressive for 3x4 pixels. Lowercase is pretty much unreadable…
You learn to read it, or at least I did as a child trying to use a small font on the c64 when connected to BBSs, so I could see ascii art without wrapping. It takes reminders like this to realize how awash in high density pixels we are now.
Agreed. Sample: https://raw.githubusercontent.com/Michaelangel007/nanofont3x...

It's difficult to read even when you know it's the Declaration of Independence.

That's not quite the fault of the font. It's the fault of the author who decided to use very small pixels. The sample images are unreadable as presented, but they're a lot more readable magnified 300%. You have to achieve a certain size before it's possible to see anything, but you don't need much detail.

However, given that the size is required anyway, there's no downside to using more detail. This font could be useful for a display with enormous pixels, but it's useless otherwise.

No I couldn't make it out even scaled up. I'd see a square, or three dots, and even relying upon context of other nearby letters I could reasonably well recognize there's no way to see if that's an [a, e, s, o, n, m] or what.

At this pixel scale I say just blat brail onto the screen and give people one more reason to learn that already well established and unambiguous writing system.

I see I have a slightly different interpretation of the word 'readable' lol.
(comment deleted)
Minuscule gets down to 2; 3 and above don't even look that weird. Maybe that pixel fonts are not the optimal choice.
> Nanofont3x4: Smallest readable 3x4 font with lowercase

Readable by who ?

(comment deleted)
Don’t let the lawyers find this font.
Not that readable.
(comment deleted)
(comment deleted)
Is this downloadable somewhere as TTF?
A nano font but huge images. The large image is a 4873 KB bitmap which can be losslessly compressed to 47 KB using PNG.
Nowadays it's often hard to even notice a 4 MB file, especially when you're on a gigabit connection or better.

Of course unfortunately not everyone has a connection like that. But can understand how someone might have missed it.

This is sometimes so hard to remember. There’s so much content on optimizing for page size — and admittedly, it does matter a lot in some industries like e-commerce and/or if you have users in less developed countries — but quite a lot of situations kind of just let you ignore it.

I work in B2B and we frankly put way more effort in than we should have to optimize bundle size before just making the assumption that everyone has a good connection and we didn’t really need to worry about it.

I work with parolees who often only have government-issued phones with maybe 5GB or 15GB of data per month, which generally only lasts the first couple of days of the month due to issues like that. I come across home pages regularly now that are >250MB of download :(
What?

Can you provide links to a page that is 250 MB download?

I'll try and find some. I remember the ones I hit were "magazine" style news sites. Without uBlock they are horrible with huge video payloads in the sidebars etc.
> Nowadays it's often hard to even notice a 4 MB file, especially when you're on a gigabit connection or better.

The images on the page load quite slowly. Wifi is terrible here due to way too many hotspots and way too many different businesses providing their own wifi. And the trunk which it is on is also horrible in it's own right so even when the wifi connnection is ok, it's still broken.

So no, this is not fine.

(ping is between 100-4000ms on a good day and speeds between 100Kb/s to about 40Mb/s (that's bit, not misspelled byte), on a bad day it's None)

Github also loads something like 4.6MB of JavaScripts and other crap, according to chrome dev tools, so ...
I won't defend that, but at least that will mostly be cached and reused. There is really no excuse for huge pictures like that, especially when they can be losslessly compressed to a fraction of their size.
It's also compressed while sending so that is most likely the unpacked size you see there.
I propose that this sort of font be called "decipherable" rather than "readable".

I could learn to read this. I can kinda-sorta make out the example, because I already know the Declaration of Independence. Is it readable the way, say, this text is? Or the PICO-8 font? No.

I think any font which is decipherable becomes readable with practice.

The characters in the font are unique and clear so learning to read it should be easier that say reading using some completely unknown alphabet.

This font should be easier to read than most people's hand writing.

The lowercase characters are non-unique, which may be what GP was referring to. For instance "ox" and "co" can only be distinguished by context.
if more than one bit of color was allowed you could make different levels of grey/opacity hint at where the opening in the symbol should be. just as learnable and now it's unique.

taken to a silly extreme, you could compress 26 letters into 2 pixels, 3 colors, and 3 levels of opacity. before even considering a time-dimension.

a mantis shrimp just needs one pixel with color.

What is wrong with morse code? Just need one pixel that blinks.
Many people's handwriting is best described as "decipherable" as well, yes.

A readable font takes no practice to read, presuming you already read the script of the font and the language of the text. A decipherable one can be sort of limped through at first and probably picked up to fluency with experience. Although, as the article notes, this font has homonymous glyphs, there are only a few words where that creates ambiguity, and as few as none where it would be ambiguous in context.

> A readable font takes no practice to read

No. Any font takes a lot of practice to read. Maybe the difference is that you define "readable" as readable immediately by anyone who is already familiar with modern fonts?

I'm sure medieval fonts were readable to pepole who wrote them, but when I look at them I need to labor at every letter.

> Any font takes a lot of practice to read

Yes, people aren't born knowing how to read.

> you define "readable" as readable immediately by anyone who is already familiar with modern fonts

This is the only reasonable definition of "readable".

I worked on project planning software years ago. We got caught in a loop arguing about fonts and data density.

We were getting lots of clipping of text and I asserted that even a couple more characters on the screen would improve people’s abilities to guess what the entire phrase was. You can derail momentum in project management meetings by having people ask what something says repeatedly. Seen it happen, it’s dumb and we can fix it.

So it came down to a shootout. We put five fonts on a projector screen, at multiple font sizes, stood everyone against the back wall of the fairly average sized meeting room (maybe 70th percentile), and had them vote.

Verdana 13pt won for legibility, even over some of the 14 pt fonts. It also got more characters per inch, so win win. Something in the range of 5-10%.

Then corporate made us change it back because their flagship app used a different font and they wanted them to match. Which made no goddamned sense because they weren’t even used together.

Incredible how much money corporations are willing to waste on this kind of bike shedding lol
> In case you are interested, there are a total of 65,536 4x4 monochrome glyphs. Here is a uber texture atlas that shows all of them with our glyphs highlighted (red) where they are in the table.

So did this font exist all along and was simply discovered?

And same goes for everything we create, but just in higher dimensions??

Unlike the flagrant dismissal in other comments I actually find use for projects like these. On some electronics that I write firmware for the OLED screen space real estate is incredibly limited, and when they need to output logs or debug info for developers it can be a pain to fit everything in a way that is usable, especially when there is no input to allow for scrolling or whatever.
This. As soon as I saw this I thought “oh neat that’ll come in use for my electronics displays”
I'd argue that character count advantage of this 3x4 versus say PICO-8's 3x5 is overshadowed by the loss of readability.
The lowercase is nigh unreadable but the all uppercase example is not too bad.

Would be cool to integrate in my split keyboard OLED screens in ZMK firmware.

(comment deleted)
Yes!

For all the discussion here, I feel like the README answers it. It was a fun project with a few use cases.

> Once the novelty wears off a "practical" example would be rendering "in-game book pages" that don't look like complete gibberish, or an "accurate print preview" with real text instead of blurry placeholder pixels that don't even look close to being the glyphs scaled down.

This seems very reasonable. They put it out there in case someone found it usefuo.

> Once the novelty wears off a "practical" example would be rendering "in-game book pages" that don't look like complete gibberish, or an "accurate print preview" with real text instead of blurry placeholder pixels that don't even look close to being the glyphs scaled down.

Low-res or LoD video game textures are a bit of a stretch but could be cool.

Whe I was in high school I had plenty of dull classes to sit through. I’m old enough that there were no phones and laptops to keep entertained.

My parents had a laser printer for their business. I realized that it had a very high DPI and also very little ink bleed. I started printing whole books I downloaded at the smallest font size that I could managed to still read, just a few point. I removed line breaks and printed out whole books on a page or two. I found it incredible how much tiny text I could fit on a page.

In class I would read with a little half folded sheet of paper hidden in a notebook. Sci-fi, Russian lit, biographies, classics. I was never caught, but it’s bizarre to think back that I was reading Crime and Punishment while the rest of the class was learning fake American history propaganda.

> Sci-fi, Russian lit, biographies, classics. I was never caught, but it’s bizarre to think back that I was reading Crime and Punishment while the rest of the class was learning fake American history propaganda.

Sounds possible your teachers figured as much and let it slide.

I did eventually show a teacher and they were shocked. Their older eyes had no way of focusing on the text and they could barely tell it was anything but a sheet with grey lines.
(comment deleted)
I was reading Crime and Punishment while the rest of the class was learning fake American history propaganda.

You were simply unaware of the classmates who were secretly mastering the tiny 3d printed blade.

I think 5x7 is the smallest size where characters are still fully recognisable, which is why it's used on all common character LCDs. Beyond that, with things like this font, reading becomes more of a "recognise vaguely evocative custom glyphs" exercise.
English speaker detected! Half kidding, but in my language that would be difficult. ÅÄÖ
It's also missing Kanji/Hanzi characters ;(
People got by using non-English languages in the 1980s when most computers only used ASCII due to their US/UK origins. Many languages already had such substitutions established, for example in German umlauts can be replaced with a following e, which were sometimes used on signs using block letters where there was no space for umlauts.
The Atari ST had a 6x6 font (5x5 for most glyphs, 5x6 including descenders) that took surprisingly few liberties with the lower case chars. I'm going by memory, but this looks like an accurate rendition: https://fontstruct.com/fontstructions/show/876150/atari_st_6

Lower case "a", "e" and "i" are not ideal, but the rest look pretty good to my eyes! (The OS used this for icon titles, so there was only ever 1 row at a time. Probably recommended.)

>Smallest readable 3x4 font with lowercase*

*Roman alphabet