Skip to main content
bofa uses the terminaltexteffects library (v0.14.2+) to create stunning terminal animations. Each run randomly selects effects to create a unique experience.

Effect System

All effects use the following shared configuration:
  • Frame Rate: 90 fps (__init__.py:102)
  • Canvas Anchoring: Center-aligned canvas and text (__init__.py:105-106)
  • Rainbow Gradient: 7-color gradient used across all effects (__init__.py:38-46)
RAINBOW_STOPS = (
    Color("#e81416"),  # Red
    Color("#ffa500"),  # Orange
    Color("#faeb36"),  # Yellow
    Color("#79c314"),  # Green
    Color("#487de7"),  # Blue
    Color("#4b369d"),  # Indigo
    Color("#70369d"),  # Violet
)

Intro Effects

The intro phase randomly selects one of three effects (33% chance each):

ColorShift

Used for: Intro animation (33% probability) Location: __init__.py:199-206
cycles
int
default:"2"
Number of times the color gradient cycles across the text
gradient_frames
int
default:"1"
Number of frames for each gradient transition step
gradient_stops
tuple[Color, ...]
default:"RAINBOW_STOPS"
Colors used in the shifting gradient
travel_direction
Gradient.Direction
default:"HORIZONTAL"
Direction the color wave travels across the text
final_gradient_stops
tuple[Color, ...]
default:"RAINBOW_STOPS"
Colors used in the final static gradient
final_gradient_direction
Gradient.Direction
default:"HORIZONTAL"
Direction of the final gradient

Spotlights

Used for: Intro animation (33% probability) and finale effect Location: __init__.py:210-216 (intro), __init__.py:292-300 (finale)

Intro Configuration

search_duration
int
default:"160"
Number of frames the spotlights search before revealing text
spotlight_count
int
default:"4"
Number of simultaneous spotlights
final_gradient_stops
tuple[Color, ...]
default:"RAINBOW_STOPS"
Colors for the final revealed text
final_gradient_direction
Gradient.Direction
default:"RADIAL"
Direction of the final gradient (radial creates a spotlight effect)

Finale Configuration

The finale version uses enhanced parameters:
search_duration
int
default:"120"
Shorter search duration for the finale
search_speed_range
tuple[float, float]
default:"(0.7, 1.4)"
Range of spotlight movement speeds
spotlight_count
int
default:"5"
More spotlights for the finale
beam_width_ratio
float
default:"1.25"
Width of each spotlight beam relative to default
beam_falloff
float
default:"0.25"
How quickly the spotlight brightness fades at edges

Spray

Used for: Intro animation (33% probability) Location: __init__.py:218-226
spray_position
str
default:"random"
Starting position of the spray effect. Randomly chosen from: "n", "ne", "e", "se", "s", "sw", "w", "nw", or "center"
spray_volume
float
default:"0.08"
Percentage of characters sprayed per frame (8%)
movement_speed_range
tuple[float, float]
default:"(0.8, 2.2)"
Range of speeds for character movement during spray
final_gradient_stops
tuple[Color, ...]
default:"RAINBOW_STOPS"
Colors for the final text
final_gradient_direction
Gradient.Direction
default:"HORIZONTAL"
Direction of the final gradient

Interlude Effect

The interlude plays 75% of the time between intro and finale.

VHSTape

Used for: Interlude glitch animation (75% probability) Location: __init__.py:249-261
total_glitch_time
int
default:"140"
Total number of frames the glitch effect runs
glitch_line_chance
float
default:"0.22"
Probability (22%) that any given line will glitch in a frame
noise_chance
float
default:"0.03"
Probability (3%) that a character becomes noise
glitch_line_colors
tuple[Color, ...]
default:"(white, ...RAINBOW_STOPS, white)"
Colors used for glitch line effects (white + rainbow + white)
glitch_wave_colors
tuple[Color, ...]
default:"same as glitch_line_colors"
Colors used for glitch wave distortions
final_gradient_stops
tuple[Color, ...]
default:"RAINBOW_STOPS"
Colors for the text after glitching completes
final_gradient_direction
Gradient.Direction
default:"HORIZONTAL"
Direction of the final gradient

Finale Effects

The finale sequence plays three effects in order:

Fireworks

Used for: Main finale explosion effect Location: __init__.py:157-173
explode_anywhere
bool
default:"True"
Allows fireworks to explode anywhere on the canvas (not just above text)
launch_delay
int
default:"12"
Number of frames between each firework launch
firework_volume
float
default:"0.12"
Percentage of canvas covered by firework particles (12%)
firework_colors
tuple[Color, ...]
default:"RAINBOW_STOPS"
Colors used for firework explosions
firework_symbol
str
default:"random"
Symbol used for firework particles. Unicode options: "✦", "✧", "❇", "❈", "✺", "*", "+", "x". ASCII fallback: "o", "*", "+", "x"
final_gradient_stops
tuple[Color, ...]
default:"RAINBOW_STOPS"
Colors for the text after fireworks complete
final_gradient_direction
Gradient.Direction
default:"HORIZONTAL"
Direction of the final gradient

Highlight

Used for: Glitter effect after fireworks Location: __init__.py:270-283
highlight_brightness
float
default:"2.6"
Brightness multiplier for the highlight beam (260% of normal)
highlight_width
int
default:"14"
Width of the highlight beam in characters
highlight_direction
CharacterGroup
default:"random diagonal"
Direction the highlight sweeps across the text. Randomly chosen from four diagonal directions:
  • DIAGONAL_BOTTOM_LEFT_TO_TOP_RIGHT
  • DIAGONAL_BOTTOM_RIGHT_TO_TOP_LEFT
  • DIAGONAL_TOP_LEFT_TO_BOTTOM_RIGHT
  • DIAGONAL_TOP_RIGHT_TO_BOTTOM_LEFT
final_gradient_stops
tuple[Color, ...]
default:"RAINBOW_STOPS"
Colors for the final text
final_gradient_direction
Gradient.Direction
default:"HORIZONTAL"
Direction of the final gradient

Unicode Support

Effects automatically adapt based on terminal encoding support (__init__.py:49-57):
  • Unicode Check: Tests if terminal can encode "✦❖✺" characters
  • Firework Symbols: Unicode terminals get 8 options vs 4 ASCII options
  • Confetti Characters: Unicode terminals use 22 characters vs 6 ASCII characters
UNICODE_CONFETTI_CHARS = "✦✧❖✺✹✷✸✶✱✲✳✴✵✼✽❇❈❉❊" + "*+x~^@"
ASCII_CONFETTI_CHARS = "*+x~^@"

Terminal Configuration

All effects share this base terminal configuration (__init__.py:100-108):
ParameterValueDescription
frame_rate90Frames per second for all animations
canvas_width0Auto-detect terminal width
canvas_height0Auto-detect terminal height
anchor_canvas"c"Center the canvas in the terminal
anchor_text"c"Center the text within the canvas
reuse_canvasTrueReuse the same canvas between frames

Build docs developers (and LLMs) love