Skip to main content

Philosophy: No Customization

bofa is intentionally not customizable. There are no configuration files, environment variables (except for terminal detection), or command-line options beyond --moon.
The tool is designed as a joke CLI with a fixed behavior. Every user gets the same experience with randomized effects.

What You Cannot Customize

Text Content

The joke text is hardcoded and cannot be changed:
BOFA = b"\x42\x6f\x66\x61\x20\x64\x65\x65\x7a\x20\x6e\x75\x74\x73"
CELEBRATE = b"\x42\x4f\x46\x41\x20\x44\x45\x45\x5a\x20\x4e\x55\x54\x53\x21\x21\x21"
Decodes to:
  • BOFA: “Bofa deez nuts”
  • CELEBRATE: “BOFA DEEZ NUTS!!!”
  • PREFIX: “Bofa” (first 4 bytes)
There is no way to display custom messages or modify the joke text.

Animation Effects

All effect parameters are hardcoded in the source:
fireworks_config.explode_anywhere = True
fireworks_config.launch_delay = 12
fireworks_config.firework_volume = 0.12
fireworks_config.firework_colors = RAINBOW_STOPS
You cannot change:
  • Where fireworks explode
  • Launch timing
  • Number of fireworks
  • Color scheme

Colors

The rainbow gradient is fixed:
RAINBOW_STOPS: Final[tuple[Color, ...]] = (
    Color("#e81416"),  # Red
    Color("#ffa500"),  # Orange
    Color("#faeb36"),  # Yellow
    Color("#79c314"),  # Green
    Color("#487de7"),  # Blue
    Color("#4b369d"),  # Indigo
    Color("#70369d"),  # Violet
)
All effects use these exact colors. There is no way to use custom color schemes.

Timing and Speed

Frame rate and animation timing are locked:
terminal_config.frame_rate = 90
You cannot make animations faster or slower. The 90 FPS frame rate is fixed.

Randomization

While effects are randomly selected, you cannot:
  • Force a specific effect
  • Control the random seed (except in moon mode where it’s always 42)
  • Disable randomization
  • Skip the interlude (it has a 75% chance)

Moon Appearance

The moon’s crater placement is deterministic:
rng = random.Random(42)  # Fixed seed
You cannot:
  • Change the moon size (it auto-fits your terminal)
  • Modify crater types or density
  • Change the text inside the moon
  • Alter the circle character (#)

What is Automatically Adjusted

Terminal Width

The text display width adapts to your terminal:
def _pick_width() -> int:
    columns = shutil.get_terminal_size(fallback=(80, 24)).columns
    target = columns - 2
    if target <= 0:
        target = columns
    return max(34, min(target, 120))
  • Automatically reads terminal size
  • Constrains between 34-120 characters
  • Leaves 1-character padding on each side

Unicode Detection

Character set is automatically chosen based on terminal capabilities:
def _unicode_ok() -> bool:
    encoding = sys.stdout.encoding
    if not encoding:
        return False
    try:
        "✦❖✺".encode(encoding)
    except UnicodeEncodeError:
        return False
    return True
The tool automatically falls back to ASCII characters if Unicode is not supported.

TTY Detection

Plain text mode activates automatically when appropriate:
if not sys.stdout.isatty() or os.environ.get("TERM", "").lower() == "dumb":
    print(msg)
    return
No animations play when:
  • Output is redirected or piped
  • TERM=dumb is set
This happens automatically without user configuration.

Environment Considerations

Terminal Requirements

For the best experience, use a modern terminal emulator that supports:
  • 256 colors or true color
  • UTF-8 encoding
  • Fast rendering (90 FPS)
Tested terminals:
  • Most modern terminal emulators work well
  • Windows Terminal, iTerm2, Alacritty, kitty, GNOME Terminal, etc.
  • VS Code integrated terminal
May not work well:
  • Very old terminal emulators
  • Terminals with slow rendering
  • Terminals without Unicode support (will use ASCII fallback)
  • Non-TTY contexts (piped output, redirects)

TERM Environment Variable

The only environment variable that affects behavior:
TERM=dumb bofa  # Forces plain text output
All other environment variables are ignored. TERM=dumb is checked explicitly to disable animations.

Terminal Size

Output adapts to current terminal size at runtime:
shutil.get_terminal_size(fallback=(80, 24))
If terminal size detection fails, assumes 80×24 (standard terminal size).

Fork and Modify

If you want customization, you’ll need to fork the source code:
git clone https://github.com/yourusername/bofa.git
cd bofa
# Edit src/bofa/__init__.py and src/bofa/moon.py
pip install -e .
What you could modify in a fork:
  • Change text content in the hardcoded bytes
  • Adjust effect parameters
  • Modify colors in RAINBOW_STOPS
  • Change frame rate
  • Add configuration file support
  • Expose CLI options for customization
But the official bofa package will always remain deliberately simple and non-customizable.

Build docs developers (and LLMs) love