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
Spotlights
Color Shift
VHS Glitch
Spray
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
spotlight_config.search_duration = 160 # intro
spotlight_config.spotlight_count = 4 # intro
# OR
spotlight_config.search_duration = 120 # finale
spotlight_config.spotlight_count = 5 # finale
spotlight_config.beam_width_ratio = 1.25
spotlight_config.beam_falloff = 0.25
You cannot change:
- Search duration
- Number of spotlights
- Beam properties
intro_config.cycles = 2
intro_config.gradient_frames = 1
intro_config.gradient_stops = RAINBOW_STOPS
intro_config.travel_direction = Gradient.Direction.HORIZONTAL
You cannot change:
- Number of cycles
- Gradient speed
- Color palette
- Animation direction
glitch_config.total_glitch_time = 140
glitch_config.glitch_line_chance = 0.22
glitch_config.noise_chance = 0.03
You cannot change:
- Glitch duration
- Glitch intensity
- Noise levels
spray_config.spray_volume = 0.08
spray_config.movement_speed_range = (0.8, 2.2)
You cannot change:
- Spray density
- Movement speed
- The position is random but not configurable
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.