ASCII Art Generator

Block-letter banners from one built-in font, with the widest line measured against 80 columns and a plain statement of where a banner belongs.

Enable JavaScript to customise; default output below.

One banner a line, up to 40 characters each. Lowercase is drawn as uppercase, since the font has one case.

What the letters are drawn with. A block character reads more solidly than a hash in a terminal.

At zero the letters touch and read as one mass. Two or three reads as separate letters, which is usually what a header wants.

Wrap as a comment

A banner in source code lives in a comment. Block is /* */, hash is #, slashes is //.

Live preview banner.txt
###  #  #  ### #  # #### ##### #   # ###
#  # #  # #    # #  #      #   #   # #  #
###  #  # #    ##   ###    #   # # # ###
#  # #  # #    # #  #      #   ## ## #
###   ##   ### #  # ####   #   #   # #

Lines                 1
Rows                  5 at 5 rows a line
Widest line           41 characters
  against 80 columns  fits, with 39 to spare

A banner is a picture of a word. A screen reader announces it as a wall
of punctuation, a search engine sees no heading in it, and selecting it
copies the fill character rather than the letters. That is fine in a
README, a terminal splash or a code comment, and it is not fine as a
heading on a page.

The widest line is 41 characters against the 80 columns most terminals,
diffs and code reviews still assume. A banner that wraps reads as broken
rather than as decoration, which is why this is the number to check
before pasting it anywhere.

If it goes in a README, put it in a fenced code block. Markdown
collapses runs of spaces everywhere else, and a banner rendered as a
paragraph becomes a single ragged line.

Every character in this text has a glyph in the font. Accented letters
and anything outside the basic set do not, and are drawn as solid blocks
rather than dropped.

One font, drawn into the tool rather than loaded from a figlet file. A
font file is a licence question and a dependency, and a banner needs one
that works rather than four hundred that might.

Letter spacing changes the feel more than the fill character does. At
zero the letters touch and read as a single mass; at two or three the
word reads as letters, which is usually what a header wants.

Keep it short. Six columns a letter means eight characters is already
most of a terminal, and a banner that needs two lines to hold a product
name is usually a sign the product name is not the thing to put in the
banner.

Output is valid and updates as you type.

A banner is a picture of a word. That is the thing to keep in mind about it: a screen reader announces it as a wall of punctuation, a search engine sees no heading, and selecting it copies hash characters rather than letters.

In a README, a terminal splash screen or a comment at the top of a file, that is fine, and those are the places it belongs. As a heading on a web page it is an image with no alt text.

So this draws the banner and measures it. The widest line is reported against 80 columns, because most terminals, diffs and code reviews still assume that width, and a banner that wraps reads as broken rather than as decoration.

How to use

  1. Put in the text, one banner a line. Lowercase is drawn as uppercase, since the font has one case.
  2. Choose the fill character and the letter spacing. At zero the letters touch; two or three reads as separate letters.
  3. Pick a comment style if the banner is going into source code.

Example

BUCKETWP at the default spacing:

###  #  #  ### #  # #### ##### #   # ###
#  # #  # #    # #  #      #   #   # #  #
###  #  # #    ##   ###    #   # # # ###
#  # #  # #    # #  #      #   ## ## #
###   ##   ### #  # ####   #   #   # #
Lines                 1
Rows                  5 at 5 rows a line
Widest line           41 characters
  against 80 columns  fits, with 39 to spare

Wrapped as a block comment, which is where a banner in source code lives:

/*
 *  **  ***  ***    *   * ***
 * *  * *  *  *     *   *    *
 * **** ***   *     *   *  **
 * *  * *     *      * *  *
 * *  * *    ***      *   ****
 */

Pitfalls

It is not text. Anything reading the page rather than looking at it gets nonsense. Put a real heading next to it, or keep it out of the page entirely.

Check the width before pasting. Six columns a letter means eight characters is already half a terminal. A banner that wraps looks like a mistake, and the tool tells you how much room is left.

In Markdown, use a fenced code block. Markdown collapses runs of spaces everywhere else, so a banner in a paragraph becomes one ragged line.

Accented and non-Latin characters have no glyph. They are drawn as solid blocks on purpose. Dropping them would make the banner look correct while saying something different from what you typed.

One font. Drawn into the tool rather than loaded from a figlet file, because a font file is a licence question and a dependency. If you need forty fonts, figlet itself is the answer.

Spacing changes more than the fill does. The character used for the ink matters less than whether the letters touch. Try zero and three before trying a different symbol.

Do not put a banner in a commit message. It survives into git log, git blame output and every tool that renders them at a fixed width.

Compatibility

Runs in the browser: nothing is uploaded and nothing is stored.

Every glyph is five rows of the same height, and the tests assert that plus a single width per glyph, since one row short or one column wide would shift everything after it in the line. The rendered rows have trailing spaces trimmed rather than being padded, so the output has no invisible whitespace to clean up after pasting.

The font covers A to Z, 0 to 9 and the common punctuation, and everything else falls back to a solid block that is reported separately. Lowercase is mapped to uppercase rather than left blank.

The comment wrappers produce a valid comment in C-like languages, shell and JavaScript, with trailing whitespace trimmed so a linter that objects to it has nothing to object to.

Frequently asked questions

Why only one font?
Because a font file is a dependency and a licence question, and a banner tool needs one font that works rather than four hundred that might. For the full figlet collection, use figlet.
Can I use block characters instead of hashes?
Yes. Any single character works as the fill, and a solid block reads more heavily in a terminal than a hash does. Paste the character you want into the fill field.
Why is my accented letter a solid block?
The font has no glyph for it. It is drawn as a block rather than dropped so the banner does not quietly say something different from the text you typed.
Where should a banner go?
A README, a CLI’s startup output, or a comment at the top of a long file. Not a page heading, not a commit message, and not anywhere its width is decided by somebody else’s window.
Does it work with emoji?
No. Emoji have no glyph in the font and come out as solid blocks, which is the honest answer rather than a guess at what they should look like at five rows.
Weekly drops

New tools, when there are new tools

One email when something worth using ships. No schedule to fill, so no filler.

Your address goes nowhere else, and one click unsubscribes.