Features
Cantrip
A font family for Software Alchemists
Cantrip
A font family for Software Alchemists
0xCA9721B  
A F097 FAM1LY F02 50F7WA2E ALC4EM1575
☾🜁♄♁♃i♀
Rūnstafas writan þæm leóht-buxum on alce
Cantrip
A FONT FAMILY FOR SOFTWARE ALCHEMISTS

Cantrip

Monospace fonts don't have to be boring.

O' sphinx of black quartz, judge my vow and pack my box with five dozen liquor jugs! AMAZINGLY FEW DISCOTHEQUES PROVIDE JUKEBOXES: THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG? 0118 999 88199 9119 725 3 Jinxed wizards pluck ivy from the big quilt. Mix Zapf with Veljovic and get quirky Beziers. 1337 1701 58008 90210 42069 12345 !@#$%^&*()-=_+[]{}/\| Witaj świecie Gött mos £€¥ :(){ :|:& };:

function main() { const checkboxes = document.querySelectorAll( 'input[name="font-feature"]' ); function updateFontFeatureSettings() { checkboxes.forEach(cb => { document.body.style.setProperty( `--font-feature-${cb.value}`, `${cb.checked ? 1 : 0}` ); }); } checkboxes.forEach((cb) => { cb.addEventListener("change", updateFontFeatureSettings); }); updateFontFeatureSettings(); } if (document.readyState != 'loading'){ main(); } else { document.addEventListener('DOMContentLoaded', main); }
abstract admin and api append args array Array as assert async auto axes await bar bool boolean branch break case catch chan char checkout class clone close commit config const constructor continue css data database debug def default defer del delete Dict directory DISPLAY do document done double eax elif else end enum error event except exception export extends FactoryProviderImpl fallback fallthrough False false file final finally float foo for from func function get GET git global go goto graph hash html i id if implements import in index insert instance instanceof int Integer interface is j join json JSON k kwargs lambda let LinkedList list listen listener log main MAIN-PROCEDURE Map margin max merge method min mov new nil node None nonlocal --no-verify not null object Object offset open or package padding path POST post PostgreSQL print private property protected public pull push put query queue raise range React read request require response result return RuntimeError select self set sizeof sql stack static status string struct super switch table temp template then this throw throws timestamp TODO token trace tree True true try type typename undefined union until update url user using UUID value var variable void volatile where WHERE while window with write YAML yield

Current version: 

Why?

I've been fascinated by letter forms for a long time. My own handwriting has slowly evolved to include a few intentionally unusual ones - for fun. There's something inherently satisfying about leaving exaggerated swooping forms on the page.

I also wanted to have a unique monospace font for my own use in programming. As screen real estate crowds with an endless cavalcade of side panels, I find most fonts' eighty-character horizontal space to be far too wide at any legible point size. Additionally, many code fonts focus primarily on syntax-specific ligatures, like joining an "=>" into a single arrow glyph by default. I find it kind of annoying for many of the same reasons as outlined here. What I'd rather do with ligatures is focus on the words themselves, giving individual words a more unique profile and making the text more legible under certain circumstances.

Anyway, if you enjoy this, go ahead and use it. And if not... well, I made this for myself and no one is forcing you to use it. -

Default Features

Texture Healing

Off
Aid Mix Win mix win awl imm mmi ttm llm Wii Sip amj wel ism Api well
On 
Aid Mix Win mix win awl imm mmi ttm llm Wii Sip amj wel ism Api well

This font has multiple glyphs at varying widths for certain letters. Some (like "i") can be thinned and some can be widened (like "m"). It uses contextual substitution to find nearby pairs of thinnable and widenable letters. The result is a font where a seven-letter word will always be seven times the width of a single letter, but the individual letters might be shifted to produce a more legible outcome. Think of it like reverse-kerning. Instead of adjusting the space between letters, it adjusts the letter widths themselves!

My Mission: min-max whimsy with calming pairs conjoined in Majestic Karamja, cowling whole immolated bellmouths and awwing at imminent bitter cattle militia. assertEmailFirewallWorksAndApiHasBeenEnabled() The prismatic summary? findLowerCaseValueForAirConditioningApi() Attempt All lower molars and injure no warrior's llama milk. These immigrants worry about a merry tommorrow. Lemma: Shining at Twilight, the Settlement's mime emoji amuse calm mommies walking.

Since creating this font, I discovered Monaspace, which dubbed this kerning alternative "Texture Healing". Cantrip uses a much more visually extreme version of this technique, both in terms of how much space it "borrows" and because it can do this from up to five letters away.

Swash Caps, Ligatures & Other Contextual Alternatives

This font includes some alternate capitals that will appear at the beginnings of words, and are specifically intended to make camelCaseVariableNames "pop". There are also a few other alternate glyphs that add flair if there's room to do so.

HARK! AVOID ANATHEMA NEAR LINGERING BELLIES. ANNEX XYLOPHONES SIMPLY DEAR TO RUBBERRED BACKPACKING - OVERT ZONED DIAGETIC CLOCKWORK. Call Ten Amber Xanadu Round Kyle K. findLegalXPositionForConditionalCSS() NONE PIZZA WITH LEFT BEEF. Fool the ZZYZX Zoo's dazzling zebras. In joining this jam, adjust major pigfaced finals. q[] questions EFFECTIVE QUANTUM QI of Falklands background.

Internationalization Support

Cantrip contains glyphs to cover the Latin-1 Suppliment and Latin Extended-A Unicode ranges, covering a wide variety of languages. These glyphs generally do not include variant width forms.

¿Lo tiene? ¡Claro que sí! ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ ĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁł ŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſ ╔═════════════════╤═══════╦═════════════════╤═══════╗ ║ Fried Ice Cream │ $5.95 ║ Rulltårta │ €2.30 ║ ╟─────────────────┼───────╫─────────────────┼───────╢ ║ + Sprinkles │ 60¢ ║ Pączki │ €1.43 ║ ╟─────────────────┼───────╫─────────────────┼───────╢ ║ Trifle │ £4.90 ║ Jelly Doughnut │ ¥400 ║ ╚═════════════════╧═══════╩═════════════════╧═══════╝ ¤ ¦ § ¨ © ª « ¬ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ × ÷

It also includes a few glyphs commonly used by terminal applications, including a full set of Box-Drawing characters.

user@dev 🭬 ~/src/cantrip 🭬 ./boxdemo.sh ┌─────────────────────┐ ┌─┬┐ ╔═╦╗ ╓─╥╖ ╒═╤╕ │ ╔═══╗ Cantrip Box- │ │ ││ ║ ║║ ║ ║║ │ ││ │ ╚═╦═╝ Drawing Demo │ ├─┼┤ ╠═╬╣ ╟─╫╢ ╞═╪╡ ╞═╤══╩══╤═════════════╡ └─┴┘ ╚═╩╝ ╙─╨╜ ╘═╧╛ │ ├──┬──┤ │ │ └──┴──┘ │ └─────────────────────┘

A few alchemal symbols are also available.

Primes 🜍 Sulfur 🜔 Salt ☿ Quicksilver
Classical Elements 🜂 Fire 🜄 Water 🜁 Air 🜃 Earth
Planetary Metals ☿ Quicksilver ♄ Lead ♃ Tin ♂ Iron ♀ Copper ☾ Silver (☽) ☉ Gold
Other Elements 🜈 Aqua Vitae 🜕 Nitre 🜖 Vitriol (🜗) ♁ Antimony ⛢ Platinum

Optional Styles

Alternate Cursive Styling

Cantrip includes some alternative cursive glyphs to add a bit of variance to words and make the overall sillouhette of some individual words more unique.

Assist these styles of passive glyphs with some hints suggesting there be some others in certain positions. These letters have some heft, lifting four crafty shifts. Attempt twilight standing to atone the two trips. Curse wise stylish stems, bizarre foil zeroing on dazzled stages. Sift those Special Screen visuals: WISELY COUNTERSIGN THIS CLASS OF SIXTY-TWO ACCURSED. React to these styles best: try training a pterodactyl from Etsy instead.

I should apologize to my third grade teacher. I was really annoyed that just a few years after learning the print alphabet, we suddenly had to learn an entire second alphabet because "this is the way you have to write everything when you're an adult." Why not just teach this first, then and skip the print version? I never actually had to use cursive for anything but my own signature (which doesn't even resemble letters at this point) after taking the SATs and literally everything in my professional career has been typed. So cursive has been obsolete since the 1990s, but it actaully can be kind of fun. I created this font as a sample of my own handwriting and yes, I do randomly use cursive "s" characters even though the letters otherwise don't connect.

Additional Flourish

ss03 enables some additional flourishes that make individual words more unique, but can make the text less legible.

Any affordance by gyroscopic cryogenics yields myopic yeasty foundries for pyrotechnics. Often, feverish shifters graft half wayfound gruff woff files.

Proportional Width Glyphs

ss08 causes all width-adjustable characters to always adjust their width, ignoring any requirements for matching letter pairs. The result is that the overall font is no longer anything resembling monospace. There are also a few glyphs specifically for this feature (like G -> G) that don't align at all with the monospace grid. It also activates some kerning for specific letter pairings.

ss08 Off
Amusement models true WIDEN MADLY BUMMED radii illuminate trollish vowels I'DN'T'VE KNOWN it's two o'clock at Randall's & Sally's respective discotheques. Cordially, they ALLOW GHOSTS.
ss08 On
Amusement models true WIDEN MADLY BUMMED radii illuminate trollish vowels I'DN'T'VE KNOWN it's two o'clock at Randall's & Sally's respective discotheques. Cordially, they ALLOW GHOSTS.

Alternative Numerals

This font uses "oldstyle" numerals by default, sized to match lower-case letters. This gives each letter a more distinctive shape, and I find them to be more legible overall. It does, however, make random jumbles of characters look strange - hexadecimal literals doubly so. Cantrip includes two options to handle this:

Off 
0123456789 #F0E1D2C3B4A5 0xf0e1d2c3b4a5 0xDEAD_BEEF #7fff00
lnum
0123456789 #F0E1D2C3B4A5 0xf0e1d2c3b4a5 0xDEAD_BEEF #7fff00
ss16
0123456789 #F0E1D2C3B4A5 0xf0e1d2c3b4a5 0xDEAD_BEEF #7fff00

These styles also affect some non-numeral symbols that usually appear adjecent to numbers, such as currency symbols.

Off 
$01 £23 €45 ¥67 89
lnum
$01 £23 €45 ¥67 89

Known Issues

On some text renderers, rounding errors mean the ligatures and thin - wide pairs don't exactly match their unmodified counterparts. The following lines should all be exactly the same width, with the bars lined up at the end if everything is working properly:

nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn║ mimimimimimimimimimimimimimimimimimimimimimimimimimimimimimimimimimimi║ trtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtr║

Some terminal emulators ignore glyph widths entirely and render each character on a grid. This is usually a good thing - it means higher performance overall, and a font missing certain Unicode characters won't end up with broken line widths. However, if Cantrip's thin-wide substitution is enabled, this will look very strange.

Download

Copyright © 2025-2026, Christopher Dollard
The Font Software is licensed under the SIL Open Font License, Version 1.1.

If you enjoy this open-source project, please consider donating to the Electronic Frontier Foundation.