Iosevka: the open source monospace font that fits more code
You open two files side by side in your editor and line 47 wraps in the middle of a useCallback. A 24-inch monitor, a 14px font, and you still run out of room. Iosevka, an open source monospace font maintained for over ten years, exists because of this exact problem. It's narrow on purpose. And it's one of the few fonts you can build from scratch, glyph by glyph, like writing a config file.
The project lives at typeof.net/Iosevka, with the code on GitHub and the SIL Open Font License. There was no big launch or announcement this week. The font is just still there, shipping release after release, while plenty of paid coding fonts charge a lot for much less.
So what is Iosevka?
Iosevka is a font family for code and terminals. It comes in sans-serif and slab-serif versions, both monospaced. The core idea is simple: every character takes up half an em. In practice, it's much narrower than Fira Code, JetBrains Mono or Consolas.
It was created by Belleve Invis, and what caught my attention most is how the font is made. It isn't drawn by hand in a traditional font editor. It's generated from code. The glyphs are described parametrically, and a JavaScript build system assembles the final files. It's a font that compiles.
That explains why it has so many variants:
- Iosevka and Iosevka Slab: the main versions, sans-serif and serif.
- Iosevka Term: no wide glyphs, ideal for the terminal.
- Iosevka Fixed: no ligatures, strict monospace.
- Iosevka Aile and Iosevka Etoile: quasi-proportional, made for prose and documentation.
So you can use the same family in your editor, your terminal and your README. Everything gets the same look.
Why a narrow font changes your day
Let's look at the numbers in a practical way. On a screen where JetBrains Mono shows about 100 characters per line, Iosevka at the same size shows close to 120. That's roughly 20% more usable width. It sounds small until you work in split view.
With two code panes and a terminal, every column gets breathing room. eslint with max-len: 100 stops being a fight. The side-by-side Git diff stops cutting lines off. And the Bun test panel fits without hiding the file name.
There's a cost, of course. A narrow font feels cramped for the first few days. The x-height is generous, which helps readability, but your eyes find it strange. It took me about three days to stop thinking the code looked "squeezed". After that, going back to a wide font felt like wasting pixels.
The best coding font is the one that disappears after a week.
How to install and configure Iosevka in your editor
The shortest path is grabbing the prebuilt files from the GitHub releases page. On macOS you can use Homebrew:
brew install --cask font-iosevka
brew install --cask font-iosevka-term
On Linux, most distros have a package. If yours doesn't, download the .zip from the release, drop the files into ~/.local/share/fonts, then run fc-cache -f.
In VS Code (or Cursor, which uses the same format), your settings.json looks like this:
{
"editor.fontFamily": "'Iosevka', monospace",
"editor.fontSize": 15,
"editor.lineHeight": 1.5,
"editor.fontLigatures": true,
"terminal.integrated.fontFamily": "'Iosevka Term'"
}
One tip: go 1px bigger than the font you used before. Since it's narrow, 15px in Iosevka takes up about the same width as 13px in other fonts, and it's much easier to read.
The terminal works the same way. In Ghostty, for example:
font-family = Iosevka Term
font-size = 14
If you use icons in your prompt (Starship, oh-my-zsh with a fancy theme), look for the patched version in the Nerd Fonts project. Iosevka is there too.
You can build your own version of the font
This is why Iosevka has almost religious fans. Don't like the shape of the 0? Change it. Want an l with a tail so it doesn't look like a 1? Change it. Prefer a rounder @, a higher *, a { with a different design? All of it is configurable.
There are ready-made stylistic sets that mimic the look of other well-known fonts. So you can get something close to Pragmata Pro or Fira Mono while keeping Iosevka's narrow metrics. And if you want to go further, you write a build plan in TOML:
[buildPlans.IosevkaDiego]
family = "Iosevka Diego"
spacing = "normal"
serifs = "sans"
noCvSs = true
exportGlyphNames = false
[buildPlans.IosevkaDiego.variants]
inherits = "ss08"
[buildPlans.IosevkaDiego.variants.design]
zero = "slashed"
asterisk = "hex-high"
[buildPlans.IosevkaDiego.ligations]
inherits = "dlig"
Then you clone the repo, install the dependencies and run the build:
npm install
npm run build -- ttf::IosevkaDiego
An honest warning: this build is heavy. It generates hundreds of glyphs across several weights and can max out your CPU for a good while. If your machine heats up easily like mine does, limit the build to one or two weights in the TOML, or run it on a CI machine. Another option is the customizer on the website itself, which generates the config file as you click through the options. You see a preview before compiling anything.
It's the part I like most as a dev. The font is treated like software. It has versioned config, reproducible builds and releases. You can keep your private-build-plans.toml in your dotfiles repo and have the exact same font on any machine.
Ligatures: on or off?
Iosevka supports ligatures, the kind that turn => into an arrow and !== into a single symbol. Some people love them. Some people think they're a crime against programming.
My take: in TypeScript, ligatures help a little and sometimes get in the way. When you're checking a !== against a !=, you want to see exactly how many characters are there. In a live code review, explaining code to someone, the pretty arrow can confuse a newcomer.
The good news is that Iosevka lets you pick ligature sets per language instead of "all or nothing". You can keep the arrows and turn off the rest. And if you want zero ligatures, Iosevka Fixed handles it without touching any config.
Is it worth switching fonts for this?
If you code on a laptop or work a lot with side-by-side panes, I'd say yes, try it for a week. The density gain is real and you can measure it. If you use an ultrawide monitor with a single window, the gain is smaller and your current font might already be fine.
What really sells me is the project itself. A free font, maintained for a decade, with paid-product quality and a customization model no commercial font offers. Paying hundreds of dollars for a coding font makes less and less sense when this exists for free. And honestly, few things are as nerdy as compiling your own font. It's the kind of hobby your family will never understand.
I switched a while ago and never went back. Today, all the code you see in my projects was written while staring at an Iosevka with a slashed zero and a high asterisk. A small detail, but it's the tool I look at eight hours a day.
LinkedIn summary
Line 47 kept wrapping in the middle of a `useCallback` on my 24-inch monitor. The screen wasn't the problem. The font was. I switched to Iosevka, an open source monospace font that has been maintained for over ten years. It's narrow on purpose and fits about 20% more code per line. For the first three days everything looked squeezed. After that, going back to a wide font felt like wasting pixels. What won me over: it's generated from code. You write a TOML file, pick the slashed zero and the high asterisk, and compile your own version. A font with versioned config, reproducible builds and the quality of a paid product. For free. If you live in split view, try it for a week and tell me if you switch back. #Programming #OpenSource #DevTools #Productivity #VSCode