ASCII Art Text with FIGlet: Fonts, Smushing and Where to Use It

How FIGlet turns text into banner letters, what is inside an .flf font file, the smushing rules, choosing fonts for code and terminals, and pasting banners without breaking them.

· 9 min read

Illustration for the ASCII Art Text Generator guide

Big letters drawn with keyboard characters have been part of computing culture since line printers. Today they greet you when a command-line tool starts, mark sections in long configuration files, and sit at the top of README files. Most of them come from one program and its font format: FIGlet. This guide explains how FIGlet builds a banner, what is inside a font file, how the layout and smushing rules work, how to choose a font, and how to paste the result without breaking it. You can try everything in the ASCII Art Text Generator.

A short history

FIGlet was written in 1991 by Glenn Chappell and Ian Chai. It grew out of a small program by Frank Sheeran that printed large letters for email signatures, and the name stands for "Frank, Ian and Glenn's letters". The C version reached 2.2.5 and is still packaged by most Linux distributions as figlet, alongside the related toilet program that adds colour.

The real legacy is the font format. FIGlet fonts are plain text files with the .flf extension, so anyone could draw one in an editor. Hundreds were contributed in the 1990s, and the format has been reimplemented in most languages. The generator on this site uses figlet.js by Patrick Gillespie, the author of the well-known "Text to ASCII Art Generator" web page, which bundles around 300 fonts; the tool offers a curated set of 47 that render cleanly.

Inside an .flf font file

A FIGlet font starts with a header line, then comment lines, then the drawing of each character. Here is the header of the Standard font:

flf2a$ 6 5 16 15 13 0 24463 229
FieldValueMeaning
Signature and hardblankflf2a$Format version 2a; $ is the hardblank character
Height6Every character is 6 rows tall
Baseline5Row 5 is the baseline (descenders go below it)
Max length16Longest line in the file, including end marks
Old layout15Horizontal smushing rules, old encoding
Comment lines13Lines of credits and licence text to skip
Print direction0Left to right
Full layout24463Horizontal and vertical rules, new encoding
Code-tagged count229Extra characters beyond ASCII (Latin-1 letters and more)

After the comments come the characters from ASCII 32 (space) to 126 (tilde), then seven German letters (Ä Ö Ü ä ö ü ß), then any code-tagged extras. Each character is drawn as height lines, and each line ends with an end mark, usually @, with @@ on the last line of the character. The $ hardblank is a space that must stay a space: smushing never merges it away. Standard draws its space character as a blank plus a hardblank ( $@ on each row), so words never get squeezed together.

Annotated drawing of the letter H from the FIGlet Standard font, showing its six rows, the @ end mark at the end of each row, the double @@ that closes the character, and the space character drawn with $ hardblanks
Annotated drawing of the letter H from the FIGlet Standard font, showing its six rows, the @ end mark at the end of each row, the double @@ that closes the character, and the space character drawn with $ hardblanks

How letters are joined: full width, fitting and smushing

Putting letters side by side at full width wastes space and looks loose. FIGlet offers three horizontal layouts, and each font chooses a default:

  • Full width: each letter keeps its full drawn width.
  • Fitting (kerning): each letter slides left until it touches the previous one, but nothing overlaps.
  • Smushing: the letter slides one column further, so the touching characters occupy the same column, and a rule decides which character survives.

In controlled smushing there are six numbered rules a font can switch on:

RuleNameWhat happens
1Equal characterTwo identical characters become one (| and | give |)
2Underscore_ is replaced by a border character such as | / \\ [ ] { } ( ) < >
3HierarchyOf two characters from different classes (|, /\, [], {}, (), <>), the later class wins
4Opposite pair[], {} or () facing each other become |
5Big X/\ becomes |, \/ becomes Y, >< becomes X
6HardblankTwo hardblanks become one

Universal smushing ignores the rules: the later character simply overwrites the earlier one, which is compact but can damage letters. The generator's "Letter spacing" setting maps to these modes, with "Font default" using whatever the designer encoded in the header.

The difference is easy to see with Hi in Standard. At full width the H and the i sit apart; fitted, they touch; smushed, the right bar of the H and the left bar of the i share a column, which is why the familiar FIGlet output is so tight:

 _   _ _
| | | (_)
| |_| | |
|  _  | |
|_| |_|_|
Three versions of the word Hi in the Standard font: full width with a gap between letters, fitted with the letters touching, and smushed with the vertical bars merged into one column
Three versions of the word Hi in the Standard font: full width with a gap between letters, fitted with the letters touching, and smushed with the vertical bars merged into one column

Vertical layout works the same way when text wraps to a second row of banners. The generator uses full vertical spacing so that wrapped rows never run into each other.

Choosing a font

Fonts differ in height, width and the characters they use. Some practical picks:

UseGood fontsWhy
Code comments, config filesStandard, Slant, SmallPlain ASCII, 4 to 6 rows, easy to read
Long names, narrow spacesSmall, Mini, Small Slant3 to 4 rows, narrow letters
Terminal splash screensANSI Shadow, Big, DoomBold and readable at a glance
Retro or decorativeLarry 3D, Star Wars, Graffiti, GothicDistinctive, but wide and tall
Strict 7-bit ASCII requiredStandard, Big, Banner, DoomNo Unicode at all

ANSI Shadow and ANSI Regular are worth a special mention. They are drawn with Unicode block and box-drawing characters (█, ╗, ═), so they look solid in modern terminals and editors, but they are not ASCII. If the banner goes into a file that must be pure ASCII, an old terminal or a system with an unusual code page, pick a classic font.

Width is the other constraint. Terminals and many code style guides assume 80 columns, and chat apps on phones show far fewer. Wide fonts like Banner or Colossal fit only a few letters per row. The generator's wrap width breaks text at spaces when a line would exceed the limit and shows the final size in lines and columns.

Using banners in code and documents

Comments. Wrapping the banner in comment markers lets it sit in source code without affecting the program. The generator can prefix each line with // (C, C++, Java, JavaScript, Go, Rust), # (Python, shell, Ruby, YAML, TOML) or -- (SQL, Lua, Haskell), or wrap it in a /* */ block or an HTML comment. HTML comments may not contain --, so the HTML option breaks runs of hyphens.

Markdown and README files. Put the banner inside a fenced code block (three backticks) so it renders in a monospaced font and spaces are preserved. Add the plain project name as a heading too; search engines and screen readers cannot read ASCII art.

Chat. Slack, Discord, Teams and most forums support code blocks. Without one, proportional fonts and collapsed spaces will scramble the art.

Terminals. Print the banner from a file or a string constant at startup. Keep it under 80 columns and a handful of rows so it does not push useful output off the screen.

Accessibility and limits

ASCII art is decoration. A screen reader announces it as a long string of punctuation, so in HTML mark the <pre> with aria-hidden="true" or give it a role of image with a text label, and always repeat the real text nearby. FIGlet fonts only define printable ASCII plus a few Latin-1 letters, so emoji, CJK characters and most accented letters are skipped; the generator lists any characters it could not draw.

On licensing: FIGlet fonts were contributed for free use and redistribution, and many ask that the credits inside the font file be kept if the font is modified or redistributed. A banner you render is your text drawn with the font, not a copy of the font file.

Make your own banner

Open the ASCII Art Text Generator, type your text, and use Preview all fonts to compare styles. Set the wrap width and comment style for where the banner will live, then copy it or download a .txt file. For pictures rather than text, the Image to ASCII Art tool converts photos into character art, and the Markdown viewer shows how a banner looks in a README before you commit it.

Sources

  • FIGlet and FIGfont Version 2 specification (figfont.txt), Glenn Chappell, Ian Chai and John Cowan, figlet.org.
  • figlet.js by Patrick Gillespie, github.com/patorjk/figlet.js (version 1.8 used by this tool).
  • Font credits as recorded in each .flf file's comment section.

Related searches

  • figlet fonts
  • ascii art text generator
  • ascii banner for code comments
  • figlet flf font format
  • figlet smushing rules
  • ascii art in readme
  • terminal banner text
  • ansi shadow font
  • paste ascii art in slack

Open the ASCII Art Text Generator