Bangen is an ASCII banner renderer built on pyfiglet, rich, and Pillow.
It gives you a fast live TUI, a composable effect pipeline, JSON presets, and export support for TXT, PNG, GIF, and HTML.
Built for terminal art, title cards, intros, and animated text that still feels sharp when exported.
- Live split-screen TUI with export modal
- Static and animated banner rendering
- Transparent
PNGand animated transparentGIFexport - Plain
TXTexport with exact ASCII output - Multi-stop gradients with horizontal or vertical interpolation
- Built-in presets plus user presets stored in
~/.bangen/presets/ - Effect library grouped into motion, visual, temporal, distortion, and signature tiers
- CLI workflows for rendering, exporting, listing assets, and loading presets
bangen "SYSTEM READY" --font slant --gradient "#7c3aed:#06b6d4" --effect glow --effect wavegit clone https://github.com/pro-grammer-SD/bangen.git
cd bangen
python -m venv .venv
source .venv/bin/activate
pip install -e .Requirements:
- Python
3.11+ - Pillow is included in the base install
Render a basic banner:
bangen "HELLO"Render with custom styling:
bangen "HELLO" --font slant --gradient "#ff00ff:#00ffff"Render with effects:
bangen "HELLO" --effect wave --effect glow --effect pulse --speed 1.5 --amplitude 2.0Run screensaver mode:
bangen "HELLO" --screensaverExport a GIF:
bangen "HELLO" --effect wave --effect glow --export-gif banner.gif --gif-duration 3 --gif-fps 20Launch the editor:
bangenControls:
ββnavigate fields and effectsββadjust font or numeric settingsEnteredit or toggle the selected fieldlload a saved preset or load from a custom preset fileeopen the export dialogssave the current presetqquit
The effect selector is windowed, so you can move through the full library without overflowing the controls panel.
Press e inside the TUI to open the exporter.
- Toggle
GIF,PNG, andTXT - Edit the output path directly
- Adjust GIF-only
durationandfps - Auto-update the file extension when the format changes
- Confirm overwrite when the target file already exists
bangen "HELLO"
bangen "HELLO" --font slant --gradient "#ff00ff:#00ffff"
bangen "HELLO" --gradient "#ff0000:#ffff00:#00ff00" --gradient-dir verticalbangen --list-effects
bangen --list-fonts
bangen --list-presetsbangen --preset cyberpunk "HELLO"
bangen --preset matrix "SYSTEM"
bangen --preset-file ./my_preset.json "HELLO"
bangen "HELLO" --ai "retro CRT hacker title"bangen "HELLO" --export-txt banner.txt
bangen "HELLO" --export-png banner.png
bangen "HELLO" --effect wave --effect glow --export-gif banner.gif --gif-duration 3 --gif-fps 20
bangen "HELLO" --export-html banner.htmlTurns any banner text into a full-terminal animated screensaver. It auto-fits the text to the current terminal size, switches between effect scenes, and randomizes speed, amplitude, frequency, and scene duration.
bangen "SYSTEM READY" --screensaver
bangen "NIGHT MODE" --screensaver --screensaver-duration 60
bangen "SIGNAL" --screensaver --screensaver-seed 42Notes:
Ctrl+Cexits screensaver mode--font,--gradient, presets, and AI prompts still influence the starting style- effect selection is managed by the screensaver engine, so
--effectis not the main control surface in this mode - export flags are ignored while screensaver mode is running
Useful for temporal effects such as wipe and typewriter:
bangen "HELLO" --effect wipe --animate --animate-duration 5wavevertical_wavebouncescrolldriftshake
gradient_shiftpulserainbow_cycleglowflickerscanline
typewriterfade_inwipestaggerloop_pulse
glitchchromatic_aberrationnoise_injectionmeltwarpfragment
matrix_rainfireelectricvhs_glitchneon_signwave_interferenceparticle_disintegration
Effects are order-sensitive and composable:
banner.apply(build_effect("wave", config=cfg))
banner.apply(build_effect("chromatic_aberration", config=cfg))
banner.apply(build_effect("pulse", config=cfg))Common style stacks:
cyberpunk:glitch+chromatic_aberration+pulseneon:glow+pulseorneon_signmatrix:matrix_rain+typewriterretro:scanline+flickerfire:fire+meltelectric:electric+glow
Use colon-separated hex stops:
#ff00ff:#00ffff
#ff0000:#ffff00:#00ff00
Use --gradient-dir vertical for top-to-bottom interpolation.
Saved presets live under:
~/.bangen/presets/*.json
You can create these files manually, save them from the TUI with s, or save from the CLI with --save-preset NAME.
- TUI: press
l, then chooseSAVEDorFILE - CLI:
--preset NAMEloads from built-ins or~/.bangen/presets/ - CLI:
--preset-file PATHloads a preset JSON from any path without saving it
{
"name": "my_preset",
"font": "ansi_shadow",
"gradient": "#ff00ff:#00ffff",
"gradient_direction": "horizontal",
"effects": ["wave", "glow", "pulse"],
"effect_config": {
"wave": { "speed": 1.8, "amplitude": 2.0, "frequency": 0.7 },
"pulse": { "speed": 1.2, "min_brightness": 0.55 },
"glow": {}
}
}Notes:
name,font, andgradientshould always be providedeffectsorder mattersspeed,amplitude, andfrequencymap to sharedEffectConfig- any additional keys inside
effect_configare passed to the effect constructor
bangen/
βββ effects/
β βββ base.py
β βββ distortion.py
β βββ motion.py
β βββ signature.py
β βββ temporal.py
β βββ utils.py
β βββ visual.py
βββ export/
β βββ exporter.py
β βββ gif.py
β βββ png.py
β βββ txt.py
βββ gradients/
βββ presets/
βββ rendering/
βββ tui/
βββ app.py
βββ export_dialog.py
βββ preset_dialog.py
- Animated exports look best when you keep effect stacks readable instead of maxing out distortion-heavy combinations.
- Temporal effects such as
wipeandtypewriterare best previewed with--animatein the terminal before exporting. --screensaveris designed for live terminal playback, not export generation.
MIT. See LICENSE.

