Complete ASCII art generator guide with examples, fonts, and best practices for 2026
Developer Guide

ASCII Art Generator Complete Guide: Create, Convert & Export Text to ASCII Art

55 min read
2413 words
Share:

ASCII Art Generator Complete Guide: Create, Convert & Export Text to ASCII Art

You just cloned a popular open-source project. When you run npm install, a beautiful ASCII art banner appears showing the project logo and version number.

You want that for your project.

Or maybe you’re building a CLI tool and the bland text output looks unprofessional compared to modern tools like Webpack, Create React App, or Gatsby that display stunning terminal banners.

Your tool needs visual identity.

Or perhaps you’re writing a README for your GitHub project. You want an eye-catching header that stands out in the sea of identical Markdown files.

Plain text isn’t cutting it.

This is where ASCII art transforms your terminal output, documentation, and digital presence. But here’s the problem: most developers think ASCII art is just typing random characters until something looks right. They waste hours manually tweaking layouts, struggle with alignment issues, copy-paste broken art from sketchy websites, and end up with amateur-looking results.

ASCII art seems simple—just text characters making pictures, right? Wrong. Professional ASCII art requires understanding font systems (FIGlet has 500+ fonts), choosing the right export format for your use case, knowing which tools generate the cleanest output, avoiding common rendering pitfalls across different terminals, and following best practices for readability and performance.

This guide teaches you everything. You’ll learn how ASCII art generation actually works, master every major font style and when to use each, generate ASCII art via online tools, command-line utilities, and programming APIs, export to multiple formats (HTML, Markdown, SVG, ANSI), troubleshoot rendering issues across platforms, and implement professional ASCII art in your projects.

By the end, you’ll create ASCII art faster than most developers can find a working online generator.

Quick Answer: ASCII Art Generator Essentials

Don’t have time for 10,000 words? Here’s what you need to know:

  • What ASCII art is: Visual art created using text characters from the ASCII standard (letters, numbers, symbols)
  • Best tool for beginners: Use our ASCII Art Generator for instant visual results with 100+ fonts
  • Best command-line tool: FIGlet (Linux/Mac/Windows) - industry standard, 500+ fonts, scriptable
  • Most popular fonts: Banner (large, bold), Standard (clean, readable), Slant (modern look), Block (retro style)
  • Common use cases: CLI tool banners, README headers, terminal splash screens, email signatures, social media posts
  • Export formats: Plain text (.txt), HTML, Markdown, ANSI (colored), SVG (scalable)
  • Key tip: Always use monospace fonts when displaying ASCII art (Courier New, Consolas, Monaco)
  • Installation: brew install figlet (Mac) or sudo apt install figlet (Linux)

Still here? Let’s master ASCII art generation.

What is ASCII Art?

ASCII art is visual art created using the 95 printable characters from the ASCII standard—letters, numbers, punctuation, and symbols arranged to form images or stylized text.

Think of ASCII art as typography meets pixel art. Instead of drawing with pixels, you’re drawing with characters. The result works everywhere text works: terminals, plain text files, emails, code comments, and documentation.

Why ASCII Art Matters in 2026

Modern developers use ASCII art for:

  • CLI tool branding: webpack, npm, Gatsby, Create React App all use ASCII banners
  • Terminal aesthetics: Make your tools memorable and professional
  • Cross-platform compatibility: Works in any terminal, no graphics needed
  • Retro appeal: Nostalgic, authentic developer culture
  • GitHub presence: Eye-catching README headers that stand out
  • Documentation: Visual section dividers and headers
  • Accessibility: Screen-reader compatible, SEO-friendly (it’s just text)

Real-World ASCII Art Example

Input text: “ORBIT2X”

Output with Banner font:

 ██████╗ ██████╗ ██████╗ ██╗████████╗██████╗ ██╗  ██╗
██╔═══██╗██╔══██╗██╔══██╗██║╚══██╔══╝╚════██╗╚██╗██╔╝
██║   ██║██████╔╝██████╔╝██║   ██║    █████╔╝ ╚███╔╝
██║   ██║██╔══██╗██╔══██╗██║   ██║   ██╔═══╝  ██╔██╗
╚██████╔╝██║  ██║██████╔╝██║   ██║   ███████╗██╔╝ ██╗
 ╚═════╝ ╚═╝  ╚═╝╚═════╝ ╚═╝   ╚═╝   ╚══════╝╚═╝  ╚═╝

Same text with Standard font:

  ___  ____  ____ ___ _____ ____  __  __
 / _ \|  _ \| __ )_ _|_   _|___ \ \ \/ /
| | | | |_) |  _ \| |  | |   __) | \  /
| |_| |  _ <| |_) | |  | |  / __/  /  \
 \___/|_| \_\____/___| |_| |_____|/_/\_\

Use our ASCII Art Generator to try different fonts instantly and see real-time previews.

How ASCII Art Generation Works

Understanding how ASCII art generators work helps you choose the right tools and troubleshoot issues.

The Character Mapping Process

Step 1: Font File Loading

Generator loads FLF (FIGlet Font File):
- Character definitions (A-Z, 0-9, symbols)
- Character height (6-12 lines typical)
- Character width (varies per letter)
- Baseline and spacing rules

Step 2: Text Parsing

Input: "HI"
Parse: H, I (two characters)
Load: ASCII definitions for 'H' and 'I' from font file

Step 3: Character Assembly

For "HI" in Banner font:

H from font:        I from font:
██╗  ██╗            ██╗
██║  ██║            ██║
███████║            ██║
██╔══██║            ██║
██║  ██║            ██║

Combine with spacing → Final output:
██╗  ██╗██╗
██║  ██║██║
███████║██║
██╔══██║██║
██║  ██║██║

Step 4: Apply Formatting

  • Alignment (left, center, right)
  • Width constraints
  • Letter spacing adjustments
  • Line spacing modifications
  • Borders and effects

ASCII Art Font Systems

FIGlet Font Format (.flf files):
The industry standard format used by most ASCII generators. Contains:

  • Character mappings for ASCII 32-126
  • Height and baseline information
  • Layout rules and spacing
  • Comments and metadata

Example FLF structure:

flf2a$ 8 6 15 -1 2
Standard font definition
Character definitions follow...

Font Rendering:

  1. Read font definition file
  2. Parse character height/width
  3. Map each input character to its ASCII representation
  4. Concatenate characters with proper spacing
  5. Apply alignment and effects
  6. Output final ASCII art

Performance factors:

  • Simple fonts (Standard): 5-20ms generation time
  • Complex fonts (Banner): 20-100ms generation time
  • Very large text: 100-500ms
  • Caching: Reduces subsequent generations to <5ms

ASCII Art Font Styles Explained

Choosing the right font is crucial for professional ASCII art. Here’s every font style you need to know.

Standard Fonts (Clean & Readable)

Standard Font:

 ____  _                  _               _
/ ___|| |_ __ _ _ __   __| | __ _ _ __ __| |
\___ \| __/ _` | '_ \ / _` |/ _` | '__/ _` |
 ___) | || (_| | | | | (_| | (_| | | | (_| |
|____/ \__\__,_|_| |_|\__,_|\__,_|_|  \__,_|

When to use:

  • Documentation headers
  • Code comments
  • Readable banners
  • Professional contexts

Characteristics:

  • Height: 5-6 lines
  • Clean, minimal design
  • Excellent readability
  • Universal compatibility

Banner Font:

██████╗  █████╗ ███╗   ██╗███╗   ██╗███████╗██████╗
██╔══██╗██╔══██╗████╗  ██║████╗  ██║██╔════╝██╔══██╗
██████╔╝███████║██╔██╗ ██║██╔██╗ ██║█████╗  ██████╔╝
██╔══██╗██╔══██║██║╚██╗██║██║╚██╗██║██╔══╝  ██╔══██╗
██████╔╝██║  ██║██║ ╚████║██║ ╚████║███████╗██║  ██║
╚═════╝ ╚═╝  ╚═╝╚═╝  ╚═══╝╚═╝  ╚═══╝╚══════╝╚═╝  ╚═╝

When to use:

  • CLI tool splash screens
  • Application startup banners
  • README headers
  • Maximum visual impact

Characteristics:

  • Height: 6-8 lines
  • Bold, thick characters
  • High visibility
  • Modern look with Unicode box characters

Popular banner fonts:

  • banner - Classic thick letters
  • big - Similar to banner, slightly different style
  • colossal - Even larger characters
  • doom - Gaming aesthetic

Block Fonts (Solid & Retro)

Block Font:

█████╗ █████╗ █████╗ █████╗ █████╗
█╔══█╗█╔══█╗█╔══█╗█╔══█╗█╔══█╗
█████║█████║█████║█████║█████║
█╔══█║█╔══█║█╔══█║█╔══█║█╔══█║
█████║█████║█████║█████║█████║
╚════╝╚════╝╚════╝╚════╝╚════╝

When to use:

  • Retro/vintage aesthetics
  • Gaming projects
  • 80s/90s nostalgia themes
  • Terminal games

Characteristics:

  • Solid block characters (█ ▓ ▒ ░)
  • High contrast
  • Pixel-art feel
  • Strong visual presence

Slant Fonts (Modern & Dynamic)

Slant Font:

   _____ __            __
  / ___// /___ _____  / /_
  \__ \/ / __ `/ __ \/ __/
 ___/ / / /_/ / / / / /_
/____/_/\__,_/_/ /_/\__/

When to use:

  • Modern applications
  • Stylish headers
  • Professional projects
  • Dynamic feel needed

Characteristics:

  • Italicized appearance
  • Contemporary look
  • Good readability
  • Space-efficient

Small/Mini Fonts (Compact)

Small Font:

_|_|_|  _|      _|    |_|  _|  _|
_|      _|_|  _|_|  _|  _| _|  _|
_|_|    _|  _|  _|  _|_|_| _|  _|
_|      _|      _|  _|  _| _|  _|
_|_|_|  _|      _|  _|  _| _|  _|

When to use:

  • Space-constrained environments
  • Inline decorations
  • Subtle headers
  • Mobile/narrow displays

Characteristics:

  • Height: 3-5 lines
  • Compact width
  • Lower visual impact
  • Better for long text

Script/Cursive Fonts (Elegant)

Script Font:

   ____           _       __
  / __/__________(_)___  / /_
 _\ \/ __/ __/ / / / _ \/ __/
/___/\__/_/ /_/_/_/ .__/\__/
                 /_/

When to use:

  • Signatures
  • Artistic projects
  • Elegant headers
  • Personal branding

Characteristics:

  • Flowing, connected style
  • Less readable than block fonts
  • Decorative appeal
  • Unique personality

Graffiti Fonts (Edgy & Bold)

3D Font:

  ___   ____
 / _ | / __/
/_//_//_/

When to use:

  • Gaming projects
  • Youth-oriented content
  • Urban/street aesthetic
  • Bold statements

Characteristics:

  • 3D effects
  • Shadow elements
  • High visual impact
  • Playful energy

Choosing the Right Font

Project Type Recommended Font Reasoning
CLI Tool Banner, Big Professional, visible, industry standard
README Header Banner, Standard Clean, works on GitHub
Code Comments Standard, Small Readable, not intrusive
Email Signature Small, Script Professional, compact
Terminal Game Block, Doom Retro gaming feel
Error Messages Big, Banner High visibility for alerts
Loading Screen Standard, Slant Clean, modern
Logo/Branding Banner, 3D Memorable, distinctive

Try all fonts instantly with our ASCII Art Generator and see real-time previews.

How to Generate ASCII Art

There are three main methods: online tools, command-line utilities, and programming APIs. Choose based on your workflow.

Method 1: Online ASCII Art Generators

Best for: Quick generation, visual preview, no installation

Using orbit2x ASCII Art Generator

Our ASCII Art Generator offers:

  1. 100+ Professional Fonts

    • Banner, Standard, Slant, Block, and more
    • Real-time preview as you type
    • Font categorization (professional, decorative, compact)
  2. Advanced Customization

    • Text alignment (left, center, right)
    • Letter spacing control
    • Line spacing adjustment
    • Border styles (single, double, custom)
    • Width constraints
  3. Multiple Export Formats

    • Plain text (.txt)
    • HTML with styling
    • Markdown code blocks
    • ANSI colored output
    • SVG vector format
    • JSON with metadata
  4. Instant Results

    • No registration required
    • Copy to clipboard
    • Download as file
    • Share URL with settings

Example workflow:

1. Visit orbit2x.com/ascii-generator
2. Type your text: "HELLO WORLD"
3. Select font: "Banner"
4. Adjust alignment: "Center"
5. Click "Generate"
6. Copy output or download

Advantages:

  • Zero setup required
  • Visual font comparison
  • Export format flexibility
  • Mobile-friendly
  • Batch generation support

Perfect for:

  • One-time generations
  • Font exploration
  • Non-technical users
  • Quick prototyping

Method 2: Command-Line Tools

Best for: Automation, scripting, terminal workflows

Using FIGlet (Industry Standard)

Installation:

# macOS
brew install figlet

# Ubuntu/Debian
sudo apt-get install figlet

# Fedora/RHEL
sudo dnf install figlet

# Windows (via Chocolatey)
choco install figlet

# Windows (via Scoop)
scoop install figlet

Basic Usage:

# Simple generation
figlet "Hello World"

# Output:
#  _   _      _ _        __        __         _     _
# | | | | ___| | | ___   \ \      / /__  _ __| | __| |
# | |_| |/ _ \ | |/ _ \   \ \ /\ / / _ \| '__| |/ _` |
# |  _  |  __/ | | (_) |   \ V  V / (_) | |  | | (_| |
# |_| |_|\___|_|_|\___/     \_/\_/ \___/|_|  |_|\__,_|

Specifying Fonts:

# Use specific font
figlet -f banner "BANNER"

# Use slant font
figlet -f slant "Slanted"

# List all available fonts
figlet -l

Alignment Options:

# Left-aligned (default)
figlet -l "Left"

# Center-aligned
figlet -c "Center"

# Right-aligned
figlet -r "Right"

Width Control:

# Set maximum width to 80 characters
figlet -w 80 "Narrow Text"

# Auto-detect terminal width
figlet -w $(tput cols) "Terminal Width"

# No width limit
figlet -w 300 "Very Wide Text"

Advanced Options:

# Kern text (reduce spacing)
figlet -k "Kerned"

# Smushing (overlap characters)
figlet -s "Smushed"

# Full width (no overlap)
figlet -f "Full Width"

# Print font info
figlet -I 2  # Display font directory
figlet -I 3  # Display default font

Exporting to Files:

# Save to file
figlet "Header" > header.txt

# Append to file
figlet "More" >> header.txt

# Copy to clipboard (macOS)
figlet "Copy" | pbcopy

# Copy to clipboard (Linux)
figlet "Copy" | xclip -selection clipboard

# Copy to clipboard (Windows)
figlet "Copy" | clip

Practical Examples:

# Create README header
figlet -f banner "MY PROJECT" > README_header.txt

# Generate build success message
figlet -c -f slant "BUILD SUCCESS"

# Create error banner
figlet -f doom "ERROR" | tee error_banner.txt

# Multi-line with specific font
figlet -f standard "Line 1" && figlet -f small "Line 2"

Using Toilet (Enhanced FIGlet with Colors)

Installation:

# macOS
brew install toilet

# Ubuntu/Debian
sudo apt-get install toilet

# Fedora
sudo dnf install toilet

Color Effects:

# Rainbow colors
toilet -f mono12 --gay "Rainbow"

# Metal effect (grayscale gradient)
toilet -f mono12 --metal "Metal"

# Random colors
toilet -f mono12 --rainbow "Random"

Border Effects:

# Add border
toilet -f standard --border "Bordered"

# Custom border color
toilet -f standard --border --gay "Color Border"

Filters and Effects:

# Flip horizontally
toilet -f standard --flip "Flipped"

# Flip vertically
toilet -f standard --flop "Flopped"

# Rotate 180 degrees
toilet -f standard --rotate "Rotated"

Export Formats:

# HTML output
toilet -f standard --html "HTML" > output.html

# ANSI output (preserves colors)
toilet --gay "Colors" > colored.ans

# IRC color codes
toilet --irc "IRC Colors"

Combining Effects:

# Rainbow + border
toilet -f mono12 --gay --border "Fancy"

# Metal + flip
toilet -f mono12 --metal --flip "Effect Combo"

Using JP2a (Image to ASCII Conversion)

Installation:

# macOS
brew install jp2a

# Ubuntu/Debian
sudo apt-get install jp2a

Convert Images to ASCII:

# Basic conversion
jp2a image.jpg

# Specify width
jp2a --width=80 photo.png

# Use custom character set
jp2a --chars=" .:-=+*#%@" picture.jpg

# Color output
jp2a --color landscape.jpg

# Save to file
jp2a --width=120 photo.jpg --output=ascii_art.txt

# HTML output with colors
jp2a --color --html photo.jpg > output.html

Method 3: Programming and API Integration

Best for: Application integration, automation, dynamic generation

JavaScript/Node.js

Installation:

npm install figlet

Basic Usage:

const figlet = require('figlet');

// Callback style
figlet('Hello World', function(err, data) {
    if (err) {
        console.log('Something went wrong...');
        console.dir(err);
        return;
    }
    console.log(data);
});

// Output:
//  _   _      _ _        __        __         _     _
// | | | | ___| | | ___   \ \      / /__  _ __| | __| |
// | |_| |/ _ \ | |/ _ \   \ \ /\ / / _ \| '__| |/ _` |
// |  _  |  __/ | | (_) |   \ V  V / (_) | |  | | (_| |
// |_| |_|\___|_|_|\___/     \_/\_/ \___/|_|  |_|\__,_|

With Specific Font:

figlet.text('JavaScript', {
    font: 'Banner',
    horizontalLayout: 'default',
    verticalLayout: 'default',
    width: 80,
    whitespaceBreak: true
}, function(err, data) {
    if (err) {
        console.log('Error:', err);
        return;
    }
    console.log(data);
});

Synchronous Version:

// Faster for simple use cases
const ascii = figlet.textSync('Sync Text', {
    font: 'Standard'
});
console.log(ascii);

List Available Fonts:

figlet.fonts(function(err, fonts) {
    if (err) {
        console.log('Error:', err);
        return;
    }
    console.log('Available fonts:', fonts);
    // Output: ['Banner', 'Big', 'Block', 'Standard', ...]
});

Express.js Integration:

const express = require('express');
const figlet = require('figlet');
const app = express();

app.get('/ascii', (req, res) => {
    const text = req.query.text || 'Hello';
    const font = req.query.font || 'Standard';

    figlet.text(text, { font }, (err, data) => {
        if (err) {
            return res.status(500).json({ error: err.message });
        }
        res.json({
            success: true,
            ascii_art: data,
            font_used: font
        });
    });
});

app.listen(3000, () => {
    console.log(figlet.textSync('Server Ready', { font: 'Banner' }));
});

React Component Example:

import React, { useState, useEffect } from 'react';

function ASCIIDisplay({ text, font = 'Standard' }) {
    const [ascii, setAscii] = useState('');

    useEffect(() => {
        fetch(`/api/ascii?text=${encodeURIComponent(text)}&font=${font}`)
            .then(res => res.json())
            .then(data => setAscii(data.ascii_art))
            .catch(err => console.error(err));
    }, [text, font]);

    return (
        <pre style={{
            fontFamily: 'monospace',
            fontSize: '12px',
            lineHeight: 1,
            overflow: 'auto'
        }}>
            {ascii}
        </pre>
    );
}

Python

Installation:

pip install pyfiglet

Basic Usage:

import pyfiglet

# Simple generation
result = pyfiglet.figlet_format("Hello World")
print(result)

# Output:
#  _   _      _ _        __        __         _     _
# | | | | ___| | | ___   \ \      / /__  _ __| | __| |
# | |_| |/ _ \ | |/ _ \   \ \ /\ / / _ \| '__| |/ _` |
# |  _  |  __/ | | (_) |   \ V  V / (_) | |  | | (_| |
# |_| |_|\___|_|_|\___/     \_/\_/ \___/|_|  |_|\__,_|

With Specific Font:

# Use banner font
banner = pyfiglet.figlet_format("Python", font="banner")
print(banner)

# Use slant font
slant = pyfiglet.figlet_format("Slanted", font="slant")
print(slant)

Using Figlet Class:

from pyfiglet import Figlet

# Create Figlet instance
f = Figlet(font='standard')
print(f.renderText('Hello'))

# Custom width
f = Figlet(font='banner', width=100)
print(f.renderText('Wide Text'))

List Available Fonts:

from pyfiglet import FigletFont

# Get all fonts
fonts = FigletFont.getFonts()
print(f"Total fonts: {len(fonts)}")
print("Sample fonts:", fonts[:10])

# Output:
# Total fonts: 500+
# Sample fonts: ['banner', 'big', 'block', 'bubble', ...]

Flask API Integration:

from flask import Flask, request, jsonify
import pyfiglet

app = Flask(__name__)

@app.route('/api/ascii', methods=['GET'])
def generate_ascii():
    text = request.args.get('text', 'Hello')
    font = request.args.get('font', 'standard')

    try:
        ascii_art = pyfiglet.figlet_format(text, font=font)
        return jsonify({
            'success': True,
            'ascii_art': ascii_art,
            'font_used': font
        })
    except Exception as e:
        return jsonify({
            'success': False,
            'error': str(e)
        }), 400

if __name__ == '__main__':
    # Print startup banner
    print(pyfiglet.figlet_format("Flask ASCII API", font="banner"))
    app.run(debug=True)

CLI Tool Example:

#!/usr/bin/env python3
import argparse
import pyfiglet

def main():
    parser = argparse.ArgumentParser(description='ASCII Art Generator')
    parser.add_argument('text', help='Text to convert')
    parser.add_argument('-f', '--font', default='standard', help='Font name')
    parser.add_argument('-w', '--width', type=int, help='Output width')
    parser.add_argument('-o', '--output', help='Output file')

    args = parser.parse_args()

    # Generate ASCII art
    ascii_art = pyfiglet.figlet_format(
        args.text,
        font=args.font,
        width=args.width
    )

    if args.output:
        with open(args.output, 'w') as f:
            f.write(ascii_art)
        print(f"Saved to {args.output}")
    else:
        print(ascii_art)

if __name__ == '__main__':
    main()

PHP

Using Shell Execution:

<?php
// Simple wrapper for figlet command
function generateASCII($text, $font = 'standard') {
    $command = sprintf(
        'figlet -f %s %s',
        escapeshellarg($font),
        escapeshellarg($text)
    );
    return shell_exec($command);
}

// Usage
echo generateASCII("PHP ASCII", "banner");

// With width constraint
function generateASCIIWithWidth($text, $font, $width) {
    $command = sprintf(
        'figlet -f %s -w %d %s',
        escapeshellarg($font),
        intval($width),
        escapeshellarg($text)
    );
    return shell_exec($command);
}

echo generateASCIIWithWidth("Narrow", "standard", 60);
?>

Laravel Integration:

// In a Laravel controller
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ASCIIController extends Controller
{
    public function generate(Request $request)
    {
        $validated = $request->validate([
            'text' => 'required|string|max:100',
            'font' => 'string|in:banner,standard,slant,block'
        ]);

        $text = $validated['text'];
        $font = $validated['font'] ?? 'standard';

        $command = sprintf(
            'figlet -f %s %s',
            escapeshellarg($font),
            escapeshellarg($text)
        );

        $asciiArt = shell_exec($command);

        return response()->json([
            'success' => true,
            'ascii_art' => $asciiArt,
            'font_used' => $font
        ]);
    }
}

Go (Golang)

Installation:

go get github.com/common-nighthawk/go-figure

Basic Usage:

package main

import (
    "fmt"
    "github.com/common-nighthawk/go-figure"
)

func main() {
    // Simple generation
    myFigure := figure.NewFigure("Hello Go", "", true)
    myFigure.Print()

    // With specific font
    banner := figure.NewFigure("Golang", "banner", true)
    banner.Print()

    // Get as string
    asciiStr := banner.String()
    fmt.Println(asciiStr)
}

HTTP Server Example:

package main

import (
    "encoding/json"
    "net/http"
    "github.com/common-nighthawk/go-figure"
)

type ASCIIResponse struct {
    Success  bool   `json:"success"`
    ASCIIArt string `json:"ascii_art"`
    FontUsed string `json:"font_used"`
}

func generateHandler(w http.ResponseWriter, r *http.Request) {
    text := r.URL.Query().Get("text")
    font := r.URL.Query().Get("font")

    if text == "" {
        text = "Hello"
    }
    if font == "" {
        font = "standard"
    }

    myFigure := figure.NewFigure(text, font, true)

    response := ASCIIResponse{
        Success:  true,
        ASCIIArt: myFigure.String(),
        FontUsed: font,
    }

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(response)
}

func main() {
    // Print startup banner
    startup := figure.NewFigure("Server Starting", "banner", true)
    startup.Print()

    http.HandleFunc("/api/ascii", generateHandler)
    http.ListenAndServe(":8080", nil)
}

Using REST APIs

Example API Request:

# POST request to generate ASCII art
curl -X POST https://orbit2x.com/api/ascii-generator \
  -H "Content-Type: application/json" \
  -d '{
    "text": "API Test",
    "font": "banner",
    "alignment": "center",
    "width": 80,
    "export_format": "txt"
  }'

Response Format:

{
  "success": true,
  "ascii_art": "ASCII art output here...",
  "width": 80,
  "height": 7,
  "font_used": "banner",
  "generation_ms": 45,
  "line_count": 7,
  "char_count": 560,
  "metadata": {
    "alignment": "center",
    "timestamp": "2026-01-15T10:30:00Z"
  }
}

Compare different methods with our ASCII Art Generator to find what works best for your workflow.

ASCII Art Export Formats

Different formats suit different use cases. Choose wisely for compatibility and functionality.

Plain Text (.txt)

Format: Raw ASCII characters with line breaks

Use cases:

  • README files
  • Documentation
  • Email signatures
  • Log files
  • Simple terminals

Example:

 _   _ ____ ___ ___
| | | / ___|_ _|_ _|
| |_| \___ \| | | |
|  _  |___) | | | |
|_| |_|____/___|___|

Exporting:

# Command-line
figlet "TEXT" > output.txt

# JavaScript
const fs = require('fs');
const ascii = figlet.textSync('TEXT');
fs.writeFileSync('output.txt', ascii, 'utf8');

# Python
with open('output.txt', 'w') as f:
    f.write(pyfiglet.figlet_format('TEXT'))

Advantages:

  • Universal compatibility
  • Smallest file size
  • Easy to copy-paste
  • Version control friendly

Disadvantages:

  • No styling or colors
  • Monospace font required for display
  • No metadata

HTML Format (.html)

Format: ASCII wrapped in <pre> tags with CSS styling

Use cases:

  • Web pages
  • Blog posts
  • HTML emails
  • Documentation sites

Example:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ASCII Art</title>
    <style>
        .ascii-art {
            font-family: 'Courier New', Courier, monospace;
            font-size: 14px;
            line-height: 1;
            letter-spacing: 0;
            white-space: pre;
            overflow-x: auto;
            background-color: #1e1e1e;
            color: #00ff00;
            padding: 20px;
            border-radius: 5px;
        }
    </style>
</head>
<body>
    <pre class="ascii-art">
 _   _ _____ __  __ _
| | | |_   _|  \/  | |
| |_| | | | | |\/| | |
|  _  | | | | |  | | |___
|_| |_| |_| |_|  |_|_____|
    </pre>
</body>
</html>

With Accessibility:

<figure role="img" aria-label="ORBIT2X logo in ASCII art">
    <pre class="ascii-art" aria-hidden="true">
 ██████╗ ██████╗ ██████╗ ██╗████████╗██████╗ ██╗  ██╗
██╔═══██╗██╔══██╗██╔══██╗██║╚══██╔══╝╚════██╗╚██╗██╔╝
██║   ██║██████╔╝██████╔╝██║   ██║    █████╔╝ ╚███╔╝
██║   ██║██╔══██╗██╔══██╗██║   ██║   ██╔═══╝  ██╔██╗
╚██████╔╝██║  ██║██████╔╝██║   ██║   ███████╗██╔╝ ██╗
 ╚═════╝ ╚═╝  ╚═╝╚═════╝ ╚═╝   ╚═╝   ╚══════╝╚═╝  ╚═╝
    </pre>
    <figcaption class="sr-only">ORBIT2X</figcaption>
</figure>

CSS Styling Options:

/* Dark theme */
.ascii-dark {
    background: #0d1117;
    color: #58a6ff;
    padding: 1rem;
    border: 1px solid #30363d;
}

/* Light theme */
.ascii-light {
    background: #ffffff;
    color: #24292f;
    padding: 1rem;
    border: 1px solid #d0d7de;
}

/* Matrix theme */
.ascii-matrix {
    background: #000;
    color: #00ff00;
    text-shadow: 0 0 5px #00ff00;
    animation: glow 2s ease-in-out infinite;
}

@keyframes glow {
    0%, 100% { opacity: 1; }
    50% { opacity: 0.7; }
}

Advantages:

  • Full styling control with CSS
  • Color support
  • Responsive design possible
  • SEO-friendly (text is indexable)

Disadvantages:

  • Requires monospace font
  • More complex than plain text
  • Email client compatibility varies

Markdown Format (.md)

Format: ASCII in code blocks with triple backticks

Use cases:

  • GitHub README
  • Documentation sites
  • Wikis
  • Issue templates
  • Pull request templates

Example:

# My Project


| / \ \ / / | _ | _ \ / _ / | _ _ | |
| |/| |\ V / | |
) | |) | () _
\ |) || | | |
|
| || _/ | /| _ < _/|
/ __/ || ||
|
| || _\ ||


Welcome to my project!

With Syntax Highlighting:

```ascii
 ____                      _                           _
/ ___| _   _  ___  ___   _| |__  _ __ __ _ _ __   __| |
\___ \| | | |/ _ \/ _ \ / / '_ \| '__/ _` | '_ \ / _` |
 ___) | |_| |  __/  __/ | | |_) | | | (_| | | | | (_| |
|____/ \__, |\___|\___| |_|_.__/|_|  \__,_|_| |_|\__,_|
       |___/

**GitHub Profile README Example:**
```markdown
<div align="center">


| | | | | | | ___ | | | | ___ _ __ ___ /
| |
| |/ _ \ | |/ _ \ | |
| |/ _ \ ‘
/ _ \ / _
| _ | / | | () | | _ | __/ | | __/ / ___
|
| |_|_
|||_
/ || ||_|_| __| /_/ _\


**Full-Stack Developer | Open Source Enthusiast**

[![GitHub followers](https://img.shields.io/github/followers/username)](https://github.com/username)

</div>

Advantages:

  • Perfect for GitHub/GitLab
  • Renders in code blocks automatically
  • Version control friendly
  • Wide platform support

Disadvantages:

  • Usually no color support
  • Limited styling options
  • Must use code blocks

ANSI Format (.ans)

Format: ASCII with ANSI escape codes for colors and styling

Use cases:

  • Terminal applications
  • CLI tools
  • SSH login banners (MOTD)
  • Terminal art galleries

Example with Colors:

# Rainbow effect
toilet -f mono12 --gay "COLORS" > rainbow.ans

# Metal gradient
toilet -f mono12 --metal "STEEL" > metal.ans

# Custom ANSI codes
echo -e "\033[1;31mRED TEXT\033[0m"
echo -e "\033[1;32mGREEN TEXT\033[0m"
echo -e "\033[1;34mBLUE TEXT\033[0m"

ANSI Color Codes:

Regular Colors:
\033[0;30m - Black
\033[0;31m - Red
\033[0;32m - Green
\033[0;33m - Yellow
\033[0;34m - Blue
\033[0;35m - Magenta
\033[0;36m - Cyan
\033[0;37m - White

Bold Colors:
\033[1;31m - Bold Red
\033[1;32m - Bold Green
\033[1;34m - Bold Blue

Background Colors:
\033[41m - Red background
\033[42m - Green background
\033[44m - Blue background

Reset:
\033[0m - Reset all attributes

256 Color Support:

# Use 256 color palette
echo -e "\033[38;5;208mOrange Text\033[0m"
echo -e "\033[48;5;21mBlue Background\033[0m"

Advantages:

  • Native terminal color support
  • Styling (bold, underline, etc.)
  • No external dependencies
  • Fast rendering

Disadvantages:

  • Only works in terminals
  • Terminal compatibility varies
  • Colors lost when piping to files (unless preserved)
  • Not suitable for web

SVG Format (.svg)

Format: Scalable Vector Graphics with text elements

Use cases:

  • Website graphics
  • High-quality prints
  • Logos
  • Scalable banners

Example:

<svg xmlns="http://www.w3.org/2000/svg" width="600" height="100" viewBox="0 0 600 100">
    <rect width="600" height="100" fill="#1e1e1e"/>
    <text x="10" y="20" font-family="monospace" font-size="14" fill="#00ff00">
        <tspan x="10" dy="1.2em"> ██████╗ ██████╗ ██████╗ ██╗████████╗██████╗ ██╗  ██╗</tspan>
        <tspan x="10" dy="1.2em">██╔═══██╗██╔══██╗██╔══██╗██║╚══██╔══╝╚════██╗╚██╗██╔╝</tspan>
        <tspan x="10" dy="1.2em">██║   ██║██████╔╝██████╔╝██║   ██║    █████╔╝ ╚███╔╝ </tspan>
        <tspan x="10" dy="1.2em">██║   ██║██╔══██╗██╔══██╗██║   ██║   ██╔═══╝  ██╔██╗ </tspan>
        <tspan x="10" dy="1.2em">╚██████╔╝██║  ██║██████╔╝██║   ██║   ███████╗██╔╝ ██╗</tspan>
        <tspan x="10" dy="1.2em"> ╚═════╝ ╚═╝  ╚═╝╚═════╝ ╚═╝   ╚═╝   ╚══════╝╚═╝  ╚═╝</tspan>
    </text>
</svg>

Advantages:

  • Resolution independent
  • Scalable without quality loss
  • SEO-friendly (text is indexable)
  • Can embed in web pages
  • Editable in vector graphics software

Disadvantages:

  • Larger file size than plain text
  • Requires specific monospace font
  • More complex format

JSON Format (.json)

Format: Structured data with metadata

Use cases:

  • API responses
  • Data storage
  • Configuration files
  • Programmatic processing

Example:

{
  "text": "ORBIT2X",
  "font": "banner",
  "ascii_art": " ██████╗ ██████╗ ██████╗ ██╗████████╗██████╗ ██╗  ██╗\n██╔═══██╗██╔══██╗██╔══██╗██║╚══██╔══╝╚════██╗╚██╗██╔╝\n██║   ██║██████╔╝██████╔╝██║   ██║    █████╔╝ ╚███╔╝ \n██║   ██║██╔══██╗██╔══██╗██║   ██║   ██╔═══╝  ██╔██╗ \n╚██████╔╝██║  ██║██████╔╝██║   ██║   ███████╗██╔╝ ██╗\n ╚═════╝ ╚═╝  ╚═╝╚═════╝ ╚═╝   ╚═╝   ╚══════╝╚═╝  ╚═╝",
  "width": 64,
  "height": 6,
  "metadata": {
    "generated_at": "2026-01-15T10:30:00Z",
    "generator": "orbit2x",
    "version": "1.0",
    "alignment": "left",
    "letter_spacing": 0,
    "line_spacing": 0
  },
  "statistics": {
    "generation_time_ms": 45,
    "line_count": 6,
    "char_count": 384,
    "unique_chars": 8
  }
}

Advantages:

  • Machine-readable
  • Includes metadata
  • API-friendly
  • Easy to parse programmatically

Disadvantages:

  • Requires escaping (newlines, quotes)
  • Not human-readable for display
  • Larger file size

Export Format Comparison

Format Best For Pros Cons File Size
TXT README, Docs Universal, simple No styling Smallest
HTML Web pages Styling, colors Complex Medium
Markdown GitHub Code blocks Limited styling Small
ANSI Terminals Colors, native Terminal-only Small
SVG Graphics Scalable, quality Complex Larger
JSON APIs Metadata, structured Not for display Medium

Use our ASCII Art Generator to export in all formats with one click.

Troubleshooting Common ASCII Art Problems

Even experienced developers hit rendering issues. Here’s how to fix every common problem.

Problem 1: Characters Not Displaying Correctly

Symptoms:

  • Broken or misaligned characters
  • Question marks (?) or boxes (□) instead of ASCII
  • Garbled output
  • Missing characters

Example of broken output:

?? ??? ??
?? ??? ??
??????

Causes:

  1. Character encoding mismatch (UTF-8 vs ASCII vs Windows-1252)
  2. Font doesn’t support extended characters
  3. Terminal/console encoding issues
  4. Copy-paste corruption

Solutions:

Fix #1: Set UTF-8 Encoding

# Windows Command Prompt
chcp 65001

# Windows PowerShell
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

# Linux/Mac - check locale
echo $LANG
# Should show: en_US.UTF-8

# Set locale if needed
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8

Fix #2: Use Standard ASCII Only

# Stick to ASCII 32-126 characters
figlet -f standard "TEXT"  # Uses basic ASCII

# Avoid fonts with Unicode box characters
# BAD: banner (uses ╔═╗ Unicode)
# GOOD: standard (uses ASCII only)

Fix #3: Terminal Settings

# Windows Terminal - check settings.json
{
    "profiles": {
        "defaults": {
            "font": {
                "face": "Consolas",
                "size": 12
            },
            "useAcrylic": false
        }
    }
}

# iTerm2 (Mac) - Preferences → Profiles → Text
# Set Character Encoding to: UTF-8

# Linux - check terminal encoding
locale charmap
# Should output: UTF-8

Fix #4: Font Installation

# Install Unicode-compatible fonts

# Ubuntu/Debian
sudo apt-get install fonts-powerline fonts-dejavu

# macOS - download and install:
# - Fira Code
# - JetBrains Mono
# - Cascadia Code

# Windows - install from:
# Microsoft Store: Cascadia Code, Consolas

Testing Character Support:

# Test if terminal supports Unicode
echo "╔═══╗"
echo "║ABC║"
echo "╚═══╝"

# If you see boxes, use ASCII-only fonts
figlet -f standard "Test"  # ASCII only
figlet -f banner "Test"    # May use Unicode

Problem 2: Alignment and Spacing Issues

Symptoms:

  • Text not centered properly
  • Jagged left/right edges
  • Inconsistent spacing between characters
  • Width overflow (wrapping)

Example of misaligned output:

  ___
 |   |
  |   |  ← spacing inconsistent
|___|

Causes:

  1. Incorrect width specification
  2. Mixing proportional and monospace fonts
  3. Tab vs space inconsistency
  4. Terminal width mismatch

Solutions:

Fix #1: Specify Exact Width

# Set width to match your terminal
figlet -w 80 "Text Here"

# Auto-detect terminal width
figlet -w $(tput cols) "Auto Width"

# For files, use consistent width
figlet -w 120 "README Header" > header.txt

Fix #2: Force Monospace Font in Display

/* CSS for web display */
pre.ascii {
    font-family: 'Courier New', Courier, 'Lucida Console', monospace;
    font-size: 14px;
    line-height: 1;
    letter-spacing: 0;
}
// Terminal output
console.log('\x1b[?7l'); // Disable line wrapping
console.log(asciiArt);
console.log('\x1b[?7h'); // Re-enable line wrapping

Fix #3: Replace Tabs with Spaces

# Convert tabs to spaces
expand -t 4 input.txt > output.txt

# In code
const fixed = asciiArt.replace(/\t/g, '    ');

Fix #4: Center Text Properly

# Python centering function
def center_ascii(text, width=80):
    lines = text.split('\n')
    max_line_length = max(len(line) for line in lines)
    padding = (width - max_line_length) // 2
    return '\n'.join(' ' * padding + line for line in lines)

# Usage
ascii = pyfiglet.figlet_format("CENTER ME")
centered = center_ascii(ascii, 100)
print(centered)

Fix #5: Trim Trailing Spaces

# Remove trailing whitespace
sed 's/[[:space:]]*$//' input.txt > output.txt

# In JavaScript
const trimmed = asciiArt.split('\n')
    .map(line => line.trimEnd())
    .join('\n');

Problem 3: Font Not Found Error

Symptoms:

  • “Font not found” error message
  • Fallback to default font
  • Empty output
  • Command fails to execute

Example error:

$ figlet -f bannr "Test"
figlet: bannr: Unable to open font file

Causes:

  1. Font name misspelled (case-sensitive)
  2. Font not installed on system
  3. Incorrect font path
  4. Missing font file

Solutions:

Fix #1: List and Verify Font Names

# List all installed fonts
figlet -l

# Search for specific font
figlet -l | grep -i banner

# Test font before using
figlet -f banner "test" || echo "Font not found"

Fix #2: Install Missing Fonts

# Ubuntu/Debian - install font packages
sudo apt-get update
sudo apt-get install figlet toilet

# Additional fonts
sudo apt-get install figlet-fonts

# macOS - Homebrew
brew install figlet
brew install toilet

# Download community fonts
git clone https://github.com/xero/figlet-fonts.git
sudo cp figlet-fonts/*.flf /usr/share/figlet/

Fix #3: Use Absolute Font Path

# If font is in custom location
figlet -f /path/to/fonts/mybanner.flf "Text"

# Set font directory
export FIGLET_FONTDIR=/custom/font/path
figlet -f mybanner "Text"

Fix #4: Verify Font File Permissions

# Check font directory permissions
ls -la /usr/share/figlet/

# Fix permissions if needed
sudo chmod 644 /usr/share/figlet/*.flf
sudo chmod 755 /usr/share/figlet/

Fix #5: Use Correct Case

# Font names are case-sensitive
figlet -f Banner "Text"    # ✗ Wrong
figlet -f banner "Text"    # ✓ Correct

figlet -f STANDARD "Text"  # ✗ Wrong
figlet -f standard "Text"  # ✓ Correct

Problem 4: Output Too Large for Display

Symptoms:

  • ASCII art exceeds screen width
  • Text wrapping incorrectly
  • Vertical overflow (too tall)
  • Horizontal scrolling required

Example:

$ figlet -f banner "This is a very long piece of text"
# Output wraps ugly across multiple lines

Causes:

  1. Text too long for chosen font
  2. Font produces very wide output
  3. No width limit specified
  4. Terminal window too narrow

Solutions:

Fix #1: Limit Text Length

# Use shorter text
figlet -f banner "SHORT"  # ✓ Good

# Abbreviate long text
figlet -f banner "DevOps" # Instead of "Development Operations"

Fix #2: Use Smaller Fonts

# Instead of large fonts
figlet -f banner "Long Text Here"  # Very wide

# Use compact fonts
figlet -f small "Long Text Here"   # Much narrower
figlet -f mini "Long Text Here"    # Even more compact
figlet -f term "Long Text Here"    # Minimal width

Fix #3: Split Text Across Lines

# Instead of one long line
figlet -f banner "My Amazing Project Name"

# Split into multiple lines
figlet -f banner "My Amazing"
figlet -f banner "Project"

Fix #4: Set Width Constraints

# Limit to terminal width
TERM_WIDTH=$(tput cols)
figlet -w $TERM_WIDTH -f standard "Text"

# Or specific width
figlet -w 60 -f standard "Narrow Output"

Fix #5: Calculate Output Width

# Python: estimate width before generating
def estimate_width(text, font='standard'):
    # Rough estimates (characters per letter)
    font_widths = {
        'banner': 8,
        'big': 7,
        'standard': 6,
        'small': 5,
        'mini': 4
    }
    char_width = font_widths.get(font, 6)
    spacing = 1
    estimated = (len(text) * char_width) + ((len(text) - 1) * spacing)
    return estimated

# Check before generating
width = estimate_width("Long Text", "banner")
if width > 80:
    print("Text too long! Use shorter text or smaller font")
else:
    print(pyfiglet.figlet_format("Long Text", font="banner"))

Problem 5: Colors Not Showing in Terminal

Symptoms:

  • ANSI color codes appear as text
  • No color output (black and white only)
  • Raw escape sequences visible: \033[1;31m
  • Colors work in one terminal but not another

Example of broken color:

$ toilet --gay "COLORS"
# Output shows: \033[1;31mCOLORS\033[0m instead of colored text

Causes:

  1. Terminal doesn’t support ANSI colors
  2. Color output disabled in environment
  3. Piping removes color codes
  4. Windows Command Prompt limitations

Solutions:

Fix #1: Use Modern Terminal

# Windows - use Windows Terminal (not CMD)
# Download from Microsoft Store

# macOS - use iTerm2 or default Terminal.app
# Both support colors natively

# Linux - use modern terminal emulators:
# - GNOME Terminal
# - Konsole
# - Alacritty
# - Kitty

Fix #2: Enable Color Support

# Check if terminal supports colors
tput colors
# Should show: 256 or higher

# Set terminal type
export TERM=xterm-256color

# Verify color support
echo $TERM

Fix #3: Preserve Colors When Piping

# Colors lost when piping
toilet --gay "TEXT" | less    # ✗ No colors

# Preserve colors with -R flag
toilet --gay "TEXT" | less -R  # ✓ Colors preserved

# Force color output
toilet --force-color --gay "TEXT" | less -R

Fix #4: Windows Color Support

# Enable ANSI in Windows 10+
# Registry setting or use Windows Terminal

# PowerShell - enable VT100
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$host.UI.SupportsVirtualTerminal = $true

# Or use third-party tools
# - ConEmu
# - Cmder
# - Windows Terminal

Fix #5: Test Color Support

# Test script for color support
#!/bin/bash
if [ -t 1 ]; then
    ncolors=$(tput colors)
    if [ -n "$ncolors" ] && [ "$ncolors" -ge 8 ]; then
        echo -e "\033[1;32mColors supported: $ncolors\033[0m"
        toilet --gay "SUCCESS"
    else
        echo "Colors not supported"
        figlet "NO COLOR"
    fi
else
    echo "Not a terminal"
fi

Problem 6: Copy-Paste Formatting Loss

Symptoms:

  • Alignment breaks after pasting
  • Extra spaces or line breaks appear
  • Characters change (smart quotes, en/em dashes)
  • Layout completely destroyed

Example:

# Copied from terminal:
  ___
 |   |
|___|

# Pasted into Word/Slack:
  ___
 |   |
|___|   ← alignment broken

Causes:

  1. Rich text formatting applied
  2. Smart quotes conversion
  3. Word wrap enabled
  4. Font changed to proportional

Solutions:

Fix #1: Use Plain Text Editors

# GOOD plain text editors:
# - Notepad (Windows)
# - TextEdit in plain text mode (Mac)
# - nano, vim (Linux)
# - VS Code
# - Sublime Text

# BAD (rich text editors):
# - Microsoft Word
# - Google Docs
# - Rich text email

Fix #2: Disable Smart Quotes

# macOS - System Preferences
# Keyboard → Text → Uncheck "Use smart quotes and dashes"

# VS Code - settings.json
"editor.autoClosingQuotes": "never"

# Disable in text editors before pasting

Fix #3: Use Code Blocks

# In Markdown

_ _
| | | |
|| ||


# In Slack

_ _
| | | |
|| ||


# In Discord
\`\`\`
 _   _
| | | |
|_| |_|
\`\`\`

Fix #4: Save to File First

# Generate and save
figlet "TEXT" > ascii.txt

# Then share the file
# Or paste from file contents
cat ascii.txt | pbcopy    # Mac
cat ascii.txt | xclip     # Linux
type ascii.txt | clip     # Windows

Fix #5: HTML Pre Tags

<!-- For web/email -->
<pre style="font-family: monospace; white-space: pre;">
 _   _
| | | |
|_| |_|
</pre>

Problem 7: Performance Issues with Large Text

Symptoms:

  • Generation takes >5 seconds
  • High memory usage
  • Browser tab freezes
  • Server timeout errors

Example:

$ time figlet -f banner "This is an extremely long piece of text that will take forever"
# Takes 10+ seconds

Causes:

  1. Text too long (>500 characters)
  2. Complex font rendering
  3. Multiple effects applied simultaneously
  4. Inefficient algorithm

Solutions:

Fix #1: Limit Text Length

// Validate input length
const MAX_LENGTH = 100;

function validateText(text) {
    if (text.length > MAX_LENGTH) {
        throw new Error(`Text too long (max ${MAX_LENGTH} characters)`);
    }
    return text;
}

// Usage
try {
    const ascii = generateASCII(validateText(userInput));
} catch (err) {
    console.error(err.message);
}

Fix #2: Use Simpler Fonts

# Slow fonts (complex rendering)
figlet -f banner "Text"   # Slower
figlet -f 3d "Text"       # Slower

# Fast fonts (simple rendering)
figlet -f standard "Text" # Faster
figlet -f small "Text"    # Faster
figlet -f term "Text"     # Fastest

Fix #3: Implement Caching

const cache = new Map();

function getCachedASCII(text, font) {
    const key = `${text}-${font}`;

    if (cache.has(key)) {
        return cache.get(key);
    }

    const result = generateASCII(text, font);
    cache.set(key, result);

    // Limit cache size
    if (cache.size > 100) {
        const firstKey = cache.keys().next().value;
        cache.delete(firstKey);
    }

    return result;
}

Fix #4: Async Generation

// Don't block UI during generation
async function generateASCIIAsync(text, font) {
    return new Promise((resolve) => {
        setTimeout(() => {
            const result = figlet.textSync(text, { font });
            resolve(result);
        }, 0);
    });
}

// Usage
const ascii = await generateASCIIAsync("Text", "banner");

Fix #5: Rate Limiting

// Server-side rate limiting
const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
    windowMs: 60 * 1000, // 1 minute
    max: 100, // 100 requests per minute
    message: 'Too many requests, please try again later'
});

app.use('/api/ascii', limiter);

Diagnostic Commands Cheat Sheet

# List all fonts
figlet -l
toilet -f list

# Test specific font
figlet -f banner "TEST"

# Check terminal capabilities
echo $TERM
tput colors
locale charmap

# Test character encoding
echo "Test: áéíóú ñ ╔═╗" | od -c

# Verify installation
which figlet
figlet -v
which toilet

# Test with simple ASCII
echo "HELLO" | figlet -f standard

# Debug output
figlet "Test" > test.txt
cat -A test.txt  # Shows hidden characters ($, ^I)

# Test color support
toilet --gay "COLOR TEST"

# Find font directory
figlet -I2
ls -la $(figlet -I2)

# Test width
figlet -w 40 "Width"
figlet -w $(tput cols) "Auto"

# Performance test
time figlet -f banner "Performance Test"

ASCII Art Best Practices

Follow these guidelines for professional, maintainable ASCII art.

1. Font Selection Best Practices

Choose fonts based on context, not aesthetics alone

For Professional/Corporate Use:

# Clean, readable fonts
figlet -f standard "Company Name"
figlet -f banner "PROJECT TITLE"
figlet -f slant "Modern App"

# Avoid overly decorative
figlet -f graffiti "Corporate"  # ✗ Too casual
figlet -f bubble "Enterprise"   # ✗ Too playful

For Developer Tools/CLI:

# Industry-standard choices
figlet -f banner "WEBPACK"      # ✓ Professional
figlet -f big "CREATE-REACT-APP" # ✓ Clean
figlet -f standard "npm install" # ✓ Readable

# Match existing tool aesthetics
# Study: webpack, npm, gatsby banners

For Creative/Gaming Projects:

# Bold, stylized fonts
figlet -f doom "GAME OVER"
figlet -f 3d "LEVEL UP"
figlet -f graffiti "STREET RACER"

For Space-Constrained Environments:

# Compact fonts (email signatures, mobile)
figlet -f small "Signature"
figlet -f mini "Footer Text"
figlet -f term "Inline"

Font Testing Checklist:

# Before committing to a font:
1. Check readability at target size
2. Test in actual environment (terminal/browser/README)
3. Verify character support (numbers, punctuation)
4. Test with different text lengths
5. Check on different platforms (Windows/Mac/Linux)

2. Text Length Recommendations

Optimal character counts by font type:

# Large fonts (Banner, Big, Colossal)
figlet -f banner "SHORT"        # ✓ 5-10 chars ideal
figlet -f banner "TITLE"        # ✓ Good
figlet -f banner "PROJECT"      # ✓ Acceptable
figlet -f banner "LONG PROJECT NAME"  # ✗ Too wide

# Medium fonts (Standard, Slant)
figlet -f standard "Medium Length Text"  # ✓ 15-25 chars
figlet -f slant "Getting Started Guide"  # ✓ Good

# Small fonts (Small, Mini, Term)
figlet -f small "Configuration Management System"  # ✓ 30-40 chars

Performance Impact:

Text Length Generation Time Recommendation
1-10 chars <10ms Ideal for all fonts
11-25 chars 10-50ms Good for most fonts
26-50 chars 50-200ms Use medium/small fonts
51-100 chars 200-500ms Small fonts only
100+ chars >500ms Avoid or split into lines

Break long text into multiple lines:

# Instead of:
figlet -f banner "My Amazing Open Source Project"

# Do this:
figlet -f banner "MY AMAZING"
echo ""
figlet -f banner "OPEN SOURCE"
echo ""
figlet -f banner "PROJECT"

3. Width and Alignment Best Practices

Standard terminal widths:

# 80 columns (traditional standard)
figlet -w 80 -c "80 Columns"

# 120 columns (modern widescreen)
figlet -w 120 -c "Widescreen"

# 132 columns (wide format)
figlet -w 132 -c "Extra Wide"

# Auto-detect
figlet -w $(tput cols) -c "Auto Width"

Alignment guidelines:

Left align: Default for code, logs, documentation

figlet -l "Left Aligned"
# Best for:
# - Log file headers
# - Code comments
# - File headers

Center align: Headers, titles, banners

figlet -c "Centered Title"
# Best for:
# - README headers
# - Splash screens
# - Presentation titles

Right align: Rarely used, artistic purposes

figlet -r "Right Aligned"
# Best for:
# - Signatures
# - Creative layouts

Responsive width selection:

// Adjust font based on available width
function selectFont(terminalWidth) {
    if (terminalWidth < 60) return 'mini';
    if (terminalWidth < 80) return 'small';
    if (terminalWidth < 120) return 'standard';
    return 'banner';
}

const width = process.stdout.columns || 80;
const font = selectFont(width);
console.log(figlet.textSync('TITLE', { font }));

4. Export and Storage Best Practices

Choose the right format for your use case:

# Plain text for documentation
figlet "Header" > docs/header.txt

# HTML for web display
figlet "Web Title" | sed 's/^/<pre>/; s/$/<\/pre>/' > title.html

# Markdown for GitHub
cat > README.md << 'EOF'

$(figlet -f banner “PROJECT”)

EOF

Version control considerations:

# Store ASCII art in separate files
project/
  ├── art/
  │   ├── banner.txt
  │   ├── logo.txt
  │   └── header.txt
  ├── README.md
  └── src/

# Reference in code/docs
cat art/banner.txt

Avoid binary formats:

# DON'T: Store as images
convert ascii.txt ascii.png  # ✗ Not searchable, larger

# DO: Store as text
figlet "Logo" > logo.txt     # ✓ Searchable, smaller, diff-friendly

5. Accessibility Best Practices

Always provide text alternatives:

<!-- HTML with screen reader support -->
<figure role="img" aria-label="ORBIT2X logo">
    <pre aria-hidden="true" class="ascii-art">
 ██████╗ ██████╗ ██████╗ ██╗████████╗██████╗ ██╗  ██╗
██╔═══██╗██╔══██╗██╔══██╗██║╚══██╔══╝╚════██╗╚██╗██╔╝
██║   ██║██████╔╝██████╔╝██║   ██║    █████╔╝ ╚███╔╝
╚██████╔╝██║  ██║██████╔╝██║   ██║   ███████╗██╔╝ ██╗
 ╚═════╝ ╚═╝  ╚═╝╚═════╝ ╚═╝   ╚═╝   ╚══════╝╚═╝  ╚═╝
    </pre>
    <figcaption class="sr-only">ORBIT2X - Developer Tools</figcaption>
</figure>

<style>
.sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0,0,0,0);
    white-space: nowrap;
    border-width: 0;
}
</style>

Markdown with alt text:

![ORBIT2X ASCII Logo](banner.txt)

**ORBIT2X** - Developer Tools Platform

6. Performance Best Practices

Implement caching for repeated generation:

class ASCIICache {
    constructor(maxSize = 100) {
        this.cache = new Map();
        this.maxSize = maxSize;
    }

    get(text, font) {
        const key = `${text}:${font}`;
        if (this.cache.has(key)) {
            // Move to end (LRU)
            const value = this.cache.get(key);
            this.cache.delete(key);
            this.cache.set(key, value);
            return value;
        }
        return null;
    }

    set(text, font, value) {
        const key = `${text}:${font}`;

        // Remove oldest if at capacity
        if (this.cache.size >= this.maxSize) {
            const firstKey = this.cache.keys().next().value;
            this.cache.delete(firstKey);
        }

        this.cache.set(key, value);
    }
}

// Usage
const cache = new ASCIICache(50);

function generateWithCache(text, font) {
    const cached = cache.get(text, font);
    if (cached) return cached;

    const result = figlet.textSync(text, { font });
    cache.set(text, font, result);
    return result;
}

Lazy load fonts:

// Don't load all fonts at startup
const fontCache = {};

async function loadFont(fontName) {
    if (fontCache[fontName]) {
        return fontCache[fontName];
    }

    const response = await fetch(`/fonts/${fontName}.flf`);
    const fontData = await response.text();
    fontCache[fontName] = fontData;
    return fontData;
}

7. Security Best Practices

Validate and sanitize user input:

function validateASCIIInput(text) {
    // Length validation
    const MAX_LENGTH = 500;
    if (text.length > MAX_LENGTH) {
        throw new Error(`Text exceeds maximum length of ${MAX_LENGTH}`);
    }

    // Character whitelist (printable ASCII + common symbols)
    const allowedChars = /^[A-Za-z0-9\s!@#$%^&*()_+\-=\[\]{}|;:'",.<>?/~`\\]*$/;
    if (!allowedChars.test(text)) {
        throw new Error('Text contains invalid characters');
    }

    // Prevent XSS in HTML export
    const sanitized = text
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')
        .replace(/"/g, '&quot;')
        .replace(/'/g, '&#39;')
        .replace(/&/g, '&amp;');

    return sanitized;
}

// Usage
app.post('/api/ascii', (req, res) => {
    try {
        const text = validateASCIIInput(req.body.text);
        const ascii = generateASCII(text, req.body.font);
        res.json({ success: true, ascii_art: ascii });
    } catch (err) {
        res.status(400).json({ error: err.message });
    }
});

Rate limiting to prevent abuse:

const rateLimit = require('express-rate-limit');

const asciiLimiter = rateLimit({
    windowMs: 60 * 1000, // 1 minute
    max: 100, // 100 requests per IP
    message: 'Too many ASCII generation requests, please slow down',
    standardHeaders: true,
    legacyHeaders: false,
});

app.use('/api/ascii', asciiLimiter);

Resource limits:

import signal

class TimeoutException(Exception):
    pass

def timeout_handler(signum, frame):
    raise TimeoutException("Generation timeout")

def generate_with_timeout(text, font, timeout=5):
    """Prevent runaway generation"""
    signal.signal(signal.SIGALRM, timeout_handler)
    signal.alarm(timeout)

    try:
        result = pyfiglet.figlet_format(text, font=font)
        signal.alarm(0)  # Cancel alarm
        return result
    except TimeoutException:
        return None
    finally:
        signal.alarm(0)

8. Documentation Best Practices

Document ASCII art in code:

/**
 * Application Startup Banner
 *
 * Font: Banner
 * Generated: 2026-01-15
 * Tool: orbit2x.com/ascii-generator
 * Purpose: Displayed on successful server start
 *
 * To regenerate:
 * figlet -f banner "SERVER READY" > banner.txt
 */
const STARTUP_BANNER = `
███████╗███████╗██████╗ ██╗   ██╗███████╗██████╗
██╔════╝██╔════╝██╔══██╗██║   ██║██╔════╝██╔══██╗
███████╗█████╗  ██████╔╝██║   ██║█████╗  ██████╔╝
╚════██║██╔══╝  ██╔══██╗╚██╗ ██╔╝██╔══╝  ██╔══██╗
███████║███████╗██║  ██║ ╚████╔╝ ███████╗██║  ██║
╚══════╝╚══════╝╚═╝  ╚═╝  ╚═══╝  ╚══════╝╚═╝  ╚═╝
`;

console.log(STARTUP_BANNER);

Create a dedicated art directory:

docs/
  └── ascii-art/
      ├── README.md           # Usage guide
      ├── catalog.md          # Index of all ASCII art
      ├── banners/
      │   ├── startup.txt
      │   ├── error.txt
      │   └── success.txt
      ├── logos/
      │   └── company.txt
      └── signatures/
          ├── team-member-1.txt
          └── team-member-2.txt

Include metadata in exports:

{
    "text": "ORBIT2X",
    "font": "banner",
    "generated_by": "orbit2x.com/ascii-generator",
    "generated_at": "2026-01-15T10:30:00Z",
    "purpose": "GitHub README header",
    "settings": {
        "alignment": "center",
        "width": 80,
        "letter_spacing": 0
    },
    "ascii_art": "..."
}

Real-World Use Cases and Examples

Learn from production implementations in popular projects.

1. CLI Tool Banners (Industry Standard)

Webpack Build Output:

# What webpack shows on build
figlet -f slant "webpack"

   _____  __    _______ ____  ____ _________ __ __
  / ___/ / /   / / ___// __ \/ __ `/ ___/ //_/
 (__  ) / /   / (__  )/ /_/ / /_/ / /__/ ,<
/____/ /_/___/ /____// .___/\__,_/\___/_/|_|
           /___/    /_/

Hash: a1b2c3d4e5f6
Version: webpack 5.75.0
Time: 1234ms

Create React App:

# On npm start
figlet -f banner "React"

██████╗ ███████╗ █████╗  ██████╗████████╗
██╔══██╗██╔════╝██╔══██╗██╔════╝╚══██╔══╝
██████╔╝█████╗  ███████║██║        ██║
██╔══██╗██╔══╝  ██╔══██║██║        ██║
██║  ██║███████╗██║  ██║╚██████╗   ██║
╚═╝  ╚═╝╚══════╝╚═╝  ╚═╝ ╚═════╝   ╚═╝

Starting development server...

Implementation:

#!/usr/bin/env node
const figlet = require('figlet');
const chalk = require('chalk');

console.log(
    chalk.cyan(
        figlet.textSync('MY TOOL', {
            font: 'Banner',
            horizontalLayout: 'default'
        })
    )
);

console.log(chalk.yellow('v1.0.0\n'));
console.log('Building your project...\n');

2. GitHub README Headers

Professional project header:

<div align="center">

██████╗ ██████╗ ██████╗ ██╗████████╗██████╗ ██╗ ██╗
██╔═══██╗██╔══██╗██╔══██╗██║╚══██╔══╝╚════██╗╚██╗██╔╝
██║ ██║██████╔╝██████╔╝██║ ██║ █████╔╝ ╚███╔╝
██║ ██║██╔══██╗██╔══██╗██║ ██║ ██╔═══╝ ██╔██╗
╚██████╔╝██║ ██║██████╔╝██║ ██║ ███████╗██╔╝ ██╗
╚═════╝ ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═╝


**Developer Tools Platform**

[![GitHub stars](https://img.shields.io/github/stars/orbit2x/orbit2x)](https://github.com/orbit2x/orbit2x)
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)

[Website](https://orbit2x.com) • [Documentation](https://docs.orbit2x.com) • [Discord](https://discord.gg/orbit2x)

</div>

Generate with our tool:

# Visit orbit2x.com/ascii-generator
# Enter: ORBIT2X
# Font: Banner
# Alignment: Center
# Export as: Markdown

3. Terminal MOTD (Message of the Day)

SSH login banner:

# /etc/motd
cat << 'EOF'
 _       __     __                             __           ______                __
| |     / /__  / /________  ____ ___  ___     / /_____     / ____/___ _____  ___/ /_  __
| | /| / / _ \/ / ___/ __ \/ __ `__ \/ _ \   / __/ __ \   / /   / __ `/ __ \/ __  / / / /
| |/ |/ /  __/ / /__/ /_/ / / / / / /  __/  / /_/ /_/ /  / /___/ /_/ / / / / /_/ / /_/ /
|__/|__/\___/_/\___/\____/_/ /_/ /_/\___/   \__/\____/   \____/\__,_/_/ /_/\__,_/\__, /
                                                                                 /____/

Server: production-web-01
Uptime: 45 days
Last Login: Mon Jan 15 10:30:00 2026

===================================================================================
EOF

4. Email Signatures

Professional signature with ASCII:

Best Regards,

   _       _
  | | ___ | |__  _ __
  | |/ _ \| '_ \| '_ \
 _| | (_) | | | | | | |
(_)_|\___/|_| |_|_| |_|

John Doe
Senior Developer | orbit2x
john@orbit2x.com | +1-555-0100
https://orbit2x.com

Compact version:

# Use small font for email
figlet -f small "John Doe"

 _____      _          ___
|_   _|__ _| |_ ___   |   \ ___ ___
  | |/ _ \ ' \/ _ \  | |) / _ \/ -_)
  |_|\___/_||_\___/  |___/\___/\___|

5. Code File Headers

Python module header:

#!/usr/bin/env python3
"""
 ____        _          ____
|  _ \  __ _| |_ __ _  |  _ \ _ __ ___   ___ ___  ___ ___  ___  _ __
| | | |/ _` | __/ _` | | |_) | '__/ _ \ / __/ _ \/ __/ __|/ _ \| '__|
| |_| | (_| | || (_| | |  __/| | | (_) | (_|  __/\__ \__ \ (_) | |
|____/ \__,_|\__\__,_| |_|   |_|  \___/ \___\___||___/___/\___/|_|

Data Processing Module
Author: John Doe
Created: 2026-01-15
"""

import pandas as pd

JavaScript file header:

/*
 _____ _                   _____                  _   _
|_   _(_)_ __ ___   ___   |  ___| _ _ __   ___  _| |_(_) ___  _ __  ___
  | | | | '_ ` _ \ / _ \  | |_ | | | '_ \ / __|/ __| __| |/ _ \| '_ \/ __|
  | | | | | | | | |  __/  |  _|| |_| | | | (__| (__| |_| | (_) | | | \__ \
  |_| |_|_| |_| |_|\___|  |_|   \__,_| |_|\___|\___|\__|_|\___/|_| |_|___/

Time utility functions
@author John Doe
@created 2026-01-15
*/

export function formatTime(date) {
    // ...
}

6. Build Success/Error Messages

Success banner:

# On successful build
figlet -f banner "SUCCESS" | lolcat  # Rainbow colors

███████╗██╗   ██╗ ██████╗ ██████╗███████╗███████╗███████╗
██╔════╝██║   ██║██╔════╝██╔════╝██╔════╝██╔════╝██╔════╝
███████╗██║   ██║██║     ██║     █████╗  ███████╗███████╗
╚════██║██║   ██║██║     ██║     ██╔══╝  ╚════██║╚════██║
███████║╚██████╔╝╚██████╗╚██████╗███████╗███████║███████║
╚══════╝ ╚═════╝  ╚═════╝ ╚═════╝╚══════╝╚══════╝╚══════╝

Build completed in 12.3s

Error banner:

# On build failure
figlet -f doom "ERROR" | toilet --metal

███████╗██████╗ ██████╗  ██████╗ ██████╗
██╔════╝██╔══██╗██╔══██╗██╔═══██╗██╔══██╗
█████╗  ██████╔╝██████╔╝██║   ██║██████╔╝
██╔══╝  ██╔══██╗██╔══██╗██║   ██║██╔══██╗
███████╗██║  ██║██║  ██║╚██████╔╝██║  ██║
╚══════╝╚═╝  ╚═╝╚═╝  ╚═╝ ╚═════╝ ╚═╝  ╚═╝

Build failed at 10:30:45

7. Discord/Slack Bots

Discord bot command:

// Discord.js bot
const Discord = require('discord.js');
const figlet = require('figlet');

client.on('message', async message => {
    if (message.content.startsWith('!ascii ')) {
        const text = message.content.slice(7);

        if (text.length > 20) {
            return message.reply('Text too long! Max 20 characters.');
        }

        figlet.text(text, { font: 'Banner' }, (err, data) => {
            if (err) {
                message.reply('Error generating ASCII art');
                return;
            }
            message.channel.send('```\n' + data + '\n```');
        });
    }
});

Usage in Discord:

User: !ascii HELLO
Bot:

██╗ ██╗███████╗██╗ ██╗ ██████╗
██║ ██║██╔════╝██║ ██║ ██╔═══██╗
███████║█████╗ ██║ ██║ ██║ ██║
██╔══██║██╔══╝ ██║ ██║ ██║ ██║
██║ ██║███████╗███████╗███████╗╚██████╔╝
╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝ ╚═════╝

Try these examples with our ASCII Art Generator and adapt for your projects.

Advanced ASCII Art Techniques

Take your ASCII art skills to the next level with these advanced methods.

1. Image to ASCII Conversion

Convert photos to ASCII art:

# Using jp2a
jp2a --width=80 photo.jpg

# With custom character set
jp2a --chars=" .:-=+*#%@" landscape.png

# Color ASCII art
jp2a --color --width=120 portrait.jpg

# Save to file
jp2a --width=100 image.jpg --output=ascii_art.txt

Python implementation:

from PIL import Image
import numpy as np

# ASCII characters from light to dark
ASCII_CHARS = ['@', '#', 'S', '%', '?', '*', '+', ';', ':', ',', '.', ' ']

def image_to_ascii(image_path, width=100):
    # Load image
    img = Image.open(image_path)

    # Calculate height to maintain aspect ratio
    # Characters are ~2x taller than wide
    aspect_ratio = img.height / img.width
    new_height = int(width * aspect_ratio * 0.55)

    # Resize image
    img = img.resize((width, new_height))

    # Convert to grayscale
    img = img.convert('L')

    # Convert pixels to ASCII
    pixels = np.array(img)
    ascii_str = ''

    for row in pixels:
        for pixel in row:
            # Map pixel (0-255) to ASCII char
            ascii_str += ASCII_CHARS[pixel // 25]
        ascii_str += '\n'

    return ascii_str

# Usage
ascii_art = image_to_ascii('photo.jpg', width=80)
print(ascii_art)

# Save to file
with open('ascii_photo.txt', 'w') as f:
    f.write(ascii_art)

Tips for best results:

  • Use high-contrast images
  • Simple subjects work better than complex scenes
  • Portrait orientation often works better
  • Adjust width based on detail needed (40-120 chars)

2. Animated ASCII Art

Create simple animations:

#!/bin/bash
# Simple loading animation

frames=(
"  o  "
" /|\ "
" / \ "
""
" o   "
"/|\  "
"/ \  "
)

while true; do
    for frame in "${frames[@]}"; do
        clear
        figlet -f standard "$frame"
        sleep 0.3
    done
done

Rotating banner:

import time
import os
import pyfiglet

def clear_screen():
    os.system('cls' if os.name == 'nt' else 'clear')

def animate_text(texts, font='banner', delay=1.0):
    """Cycle through different text animations"""
    try:
        while True:
            for text in texts:
                clear_screen()
                ascii_art = pyfiglet.figlet_format(text, font=font)
                print(ascii_art)
                time.sleep(delay)
    except KeyboardInterrupt:
        clear_screen()
        print("Animation stopped")

# Usage
frames = ["LOADING", "PLEASE", "WAIT"]
animate_text(frames, font='banner', delay=0.5)

Progress indicator:

const figlet = require('figlet');

const spinChars = ['|', '/', '-', '\\'];
let i = 0;

const spinner = setInterval(() => {
    process.stdout.write(`\r${spinChars[i]} Processing... `);
    i = (i + 1) % spinChars.length;
}, 100);

// Stop after task completes
setTimeout(() => {
    clearInterval(spinner);
    console.log('\r' + figlet.textSync('DONE!', { font: 'Banner' }));
}, 5000);

3. Combining Multiple ASCII Elements

Layered design:

#!/bin/bash
# Create complex layout

# Header
figlet -f banner -c "MY PROJECT"
echo ""

# Separator line
printf '=%.0s' {1..80}
echo ""
echo ""

# Subtitle
figlet -f small -c "Version 2.0"
echo ""

# Info box
cat << 'EOF'
┌────────────────────────────────────────┐
│  Status: Online                        │
│  Uptime: 99.9%                         │
│  Last Deploy: 2026-01-15               │
└────────────────────────────────────────┘
EOF

Multi-font composition:

import pyfiglet

def create_header(title, subtitle, version):
    """Create multi-level header"""

    # Main title
    title_art = pyfiglet.figlet_format(title, font='banner')

    # Subtitle
    subtitle_art = pyfiglet.figlet_format(subtitle, font='slant')

    # Version
    version_art = pyfiglet.figlet_format(f'v{version}', font='small')

    # Combine with spacing
    header = title_art
    header += '\n'
    header += subtitle_art
    header += '\n'
    header += ' ' * 30 + version_art

    return header

# Usage
print(create_header('ORBIT2X', 'Developer Tools', '2.0'))

4. Dynamic ASCII Generation

Environment-based banners:

const figlet = require('figlet');
const chalk = require('chalk');

function getEnvironmentBanner() {
    const env = process.env.NODE_ENV || 'development';

    const banners = {
        development: {
            text: 'DEV MODE',
            font: 'Banner',
            color: chalk.yellow
        },
        staging: {
            text: 'STAGING',
            font: 'Banner',
            color: chalk.blue
        },
        production: {
            text: 'PRODUCTION',
            font: 'Banner',
            color: chalk.red
        }
    };

    const config = banners[env];
    const ascii = figlet.textSync(config.text, { font: config.font });

    return config.color(ascii);
}

console.log(getEnvironmentBanner());

User-customizable CLI:

import argparse
import pyfiglet

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('text', help='Text to convert')
    parser.add_argument('-f', '--font', default='standard')
    parser.add_argument('-w', '--width', type=int, default=80)
    parser.add_argument('-a', '--align', choices=['left', 'center', 'right'])

    args = parser.parse_args()

    # Generate ASCII
    ascii_art = pyfiglet.figlet_format(args.text, font=args.font, width=args.width)

    # Apply alignment
    if args.align == 'center':
        lines = ascii_art.split('\n')
        max_len = max(len(line) for line in lines)
        ascii_art = '\n'.join(line.center(args.width) for line in lines)

    print(ascii_art)

if __name__ == '__main__':
    main()

Resources and Further Learning

Official Tools and Libraries

FIGlet (The Original)

Toilet (Enhanced FIGlet)

Our ASCII Generator

Programming Libraries

JavaScript/Node.js:

Python:

Go:

PHP:

Font Resources

FIGlet Font Collections:

Font Categories:

  • Banner fonts: Large, bold displays
  • Script fonts: Elegant, cursive styles
  • Block fonts: Solid, geometric
  • Graffiti fonts: Urban, stylized
  • Small fonts: Compact, space-efficient

Enhance your workflow with complementary tools:

Learning Resources

Tutorials and Guides:

Communities:

Terminal Emulators with Best Support:

  • Windows Terminal - Modern, full color support
  • iTerm2 (Mac) - Excellent rendering, customizable
  • Alacritty - GPU-accelerated, cross-platform
  • Kitty - Advanced features, ligatures
  • Hyper - Electron-based, highly customizable

Books and References

Typography and Design:

  • “ASCII Art by Example” - Practical techniques
  • “The Art of Computer Programming” Vol 3 - Algorithms including text formatting
  • “Beautiful Terminal” - Terminal aesthetics guide

Technical References:

Frequently Asked Questions

General Questions

Q: What’s the difference between ASCII art and Unicode art?

A: ASCII art uses only the 95 printable ASCII characters (codes 32-126), while Unicode art can use any Unicode character including box-drawing characters (┌─┐), blocks (█▓▒░), and international symbols. ASCII art has universal compatibility but limited visual options. Unicode art looks better but may not display correctly on all systems.

Q: Can I use ASCII art commercially without attribution?

A: ASCII art itself (the output) is generally not copyrighted. However, check the specific font license—most FIGlet fonts are open source (BSD, MIT, GPL), but some may require attribution. Our ASCII Art Generator uses open-source fonts safe for commercial use.

Q: Why does my ASCII art look broken in different programs?

A: The most common cause is font mismatch. ASCII art REQUIRES monospace (fixed-width) fonts like Courier New, Consolas, or Monaco. Proportional fonts (Arial, Times New Roman) will break alignment. Also check for encoding issues (UTF-8 vs ASCII).

Q: What’s the maximum text length I should use?

A: For large fonts (Banner, Big): 5-15 characters
For medium fonts (Standard): 15-30 characters
For small fonts (Mini, Small): 30-50 characters
Longer text should be split across multiple lines for best results.

Technical Questions

Q: How do I preserve ASCII art formatting when copying?

A: Always paste into plain text editors or use code blocks:

  • Plain text: Notepad, TextEdit (plain mode), nano, vim
  • Web: <pre> tags in HTML or triple backticks in Markdown
  • Email: Use plain text mode, not rich text
  • Chat: Use code blocks (Discord: ```, Slack: ```)

Q: Can I create colored ASCII art?

A: Yes, using ANSI escape codes for terminals:

toilet --gay "Rainbow Text"
toilet --metal "Gradient"

Or use HTML/CSS for web display with custom colors.

Q: How do I convert images to ASCII art?

A: Use jp2a, ascii-image-converter, or Python/JavaScript libraries:

jp2a --width=80 photo.jpg
jp2a --color landscape.png

Best practices: High contrast images, simple subjects, adjust width for detail level.

Q: What’s the best font for readability?

A: “Standard” and “Banner” offer the best readability. Avoid overly decorative fonts (Script, Graffiti) for important information. Test your font choice in the actual display environment.

Platform-Specific Questions

Q: Colors don’t show in my Windows terminal. Why?

A: Older Command Prompt doesn’t support ANSI colors. Solutions:

  • Use Windows Terminal (free from Microsoft Store)
  • Use PowerShell 7+
  • Enable virtual terminal processing in code

Q: How do I use ASCII art in GitHub README?

A: Wrap in triple backticks for code blocks:

```
 _   _
| | | |
|_| |_|
```

Q: Can I use ASCII art in JSON API responses?

A: Yes, but escape special characters:

  • Newlines: \n
  • Quotes: \"
  • Backslashes: \\

Use our ASCII Art Generator with JSON export for proper escaping.

Q: How do I make ASCII art responsive on mobile?

A: Use smaller fonts for mobile, or detect screen width and adjust:

  • Desktop: Banner, Big fonts
  • Tablet: Standard, Slant
  • Mobile: Small, Mini fonts

Alternatively, hide ASCII art on mobile and show plain text.

Troubleshooting Questions

Q: My ASCII art has extra spaces or broken lines. What’s wrong?

A: Common causes:

  1. Not using monospace font
  2. Tab/space mixing (use spaces only)
  3. Word wrap enabled (disable in display)
  4. Wrong character encoding

Fix: Use monospace font, convert tabs to spaces, disable word wrap.

Q: Font “xyz” not found. How do I add custom fonts?

A: Download .flf (FIGlet Font) files and place in font directory:

  • Linux: /usr/share/figlet/
  • Mac: /usr/local/share/figlet/
  • Custom: Set FIGLET_FONTDIR environment variable

Find fonts at: http://www.figlet.org

Q: Generation is slow for long text. How to optimize?

A: Optimization strategies:

  1. Limit text length (<100 chars)
  2. Use simpler fonts (Standard vs Banner)
  3. Implement caching for repeated text
  4. Use async generation in web apps
  5. Add rate limiting to prevent abuse

Q: ASCII art looks different in email clients. Why?

A: Email clients vary widely in font support:

  • Use Small or Mini fonts for email
  • Test across clients (Gmail, Outlook, Apple Mail)
  • Provide plain text alternative
  • Some clients strip formatting—accept this limitation

Conclusion: Master ASCII Art Generation

You now have everything you need to create professional ASCII art for any project.

Key takeaways:

  1. Choose the right tool for your workflow

    • Online generators for quick, one-off creations
    • Command-line tools (FIGlet) for automation and scripting
    • Programming libraries for application integration
  2. Select fonts strategically

    • Professional: Standard, Banner, Slant
    • Creative: Graffiti, 3D, Script
    • Compact: Small, Mini, Term
  3. Follow best practices

    • Limit text length for readability
    • Use monospace fonts for display
    • Export in appropriate formats
    • Validate and sanitize user input
    • Implement caching for performance
  4. Troubleshoot effectively

    • Check character encoding (UTF-8)
    • Verify monospace font usage
    • Test across target environments
    • Use proper alignment and width settings

Start creating professional ASCII art today:

Try our ASCII Art Generator for instant results with 100+ fonts, multiple export formats, and real-time preview. No installation required—just type, generate, and copy.

Related tools to enhance your workflow:

Whether you’re building a CLI tool, creating a GitHub README, designing terminal banners, or adding personality to your code, ASCII art transforms plain text into memorable visual experiences.

Master ASCII art generation in 2026 and beyond.


Last updated: November 19, 2025
Tool: orbit2x.com/ascii-generator

Found this guide helpful? Share it with other developers and bookmark for future reference.

Related Articles

Continue learning with these related posts

Found This Guide Helpful?

Try our free developer tools that power your workflow. No signup required, instant results.

Share This Article

Help others discover this guide

Share:

Stay Updated

Get notified about new guides and tools