[HN Gopher] Show HN: Bash Screensavers
       ___________________________________________________________________
        
       Show HN: Bash Screensavers
        
       A github project to collect a bunch of bash-based
       screensavers/visualizations.
        
       Author : attogram
       Score  : 191 points
       Date   : 2025-10-28 11:12 UTC (11 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | attogram wrote:
       | Gallery of current screensavers:
       | https://github.com/attogram/bash-screensavers/blob/main/gall...
        
         | izabera wrote:
         | they're generally pretty but they should really hide the
         | cursor, it looks offputting in basically all cases
        
           | attogram wrote:
           | Agreed! Known bug that will get squashed...
        
       | seba_dos1 wrote:
       | You can put them onto your Plasma wallpaper and/or lockscreen
       | background with plasma-wallpaper-application:
       | https://invent.kde.org/dos/plasma-wallpaper-application
       | 
       | (thought I'd share that since its raison d'etre was to put
       | Asciiquarium there :))
        
         | imiric wrote:
         | Ah, sweet!
         | 
         | Do you know if this supports any DE (or no DE)? Or is it
         | strictly for KDE Plasma?
        
           | seba_dos1 wrote:
           | Plasma wallpaper plugins are, well, for Plasma.
           | 
           | When it comes to wallpapers, you could do a similar trick on
           | X11 DEs by putting it onto the root window (with a tool like
           | xwinwrap) and on Wayland DEs that support layer-shell (with a
           | tool like windowtolayer). I'm not aware of screen lockers
           | that do something like that, but you could always write your
           | own one.
        
             | imiric wrote:
             | Right, but I hoped it would work as a standalone Qt app.
             | 
             | Yeah, I've used xwinwrap before, but am lost on Wayland.
             | I'll look into windowtolayer, thanks. I'd rather not have
             | to write this myself...
        
         | zahlman wrote:
         | Nice. This makes them actual _screensavers_ in my view as
         | opposed to just animations. (Not that screens require  "saving"
         | any more, but still.)
        
           | messe wrote:
           | > Not that screens require "saving" any more, but still.
           | 
           | OLEDs can still suffer from burn-in, but it's also just
           | easier to have them... turn off...
        
       | FergusArgyll wrote:
       | Cool
       | 
       | What are those commit messages?
        
         | seba_dos1 wrote:
         | Protip for the author: --allow-empty ;P
        
           | xxs wrote:
           | instead of --amend?
        
             | seba_dos1 wrote:
             | Instead of adding or removing a space in random files when
             | making cute and useless commit logs.
        
               | xxs wrote:
               | that's what I meant - "amend" would not create any extra
               | commits/entries
        
               | seba_dos1 wrote:
               | ...which is not a helpful advice when what they clearly
               | wanted is to create a bunch of extra commits.
        
           | kevincox wrote:
           | But that doesn't change the files, so it won't show up in the
           | tree view as the user is trying to accomplish.
        
         | madsohm wrote:
         | AI slop - or worse, somebody trying to hide something.
        
         | warp wrote:
         | Looks like an attempt to make the main GitHub page (the part
         | above the README) display something interesting. It is messed
         | up now because of further commits, but you can see what it
         | looked like at the time here:
         | 
         | https://github.com/attogram/bash-screensavers/tree/a7369a93c...
        
         | attogram wrote:
         | See the spread-the-word script in
         | https://github.com/attogram/bash-screensavers/tree/main/spot...
         | This script generates a series of shell commands to create a
         | "spotlight" message on the main GitHub repository page. It does
         | this by generating commands that make trivial changes to the
         | top 12 files and directories and then commit those changes with
         | custom messages.
        
       | alejoar wrote:
       | Doesn't work for me on MacOS:
       | 
       | I get "mapfile: command not found"
        
         | SeeManDo wrote:
         | Same here
        
           | SeeManDo wrote:
           | Bash Screensavers v0.0.27 (Mystic Shine)
           | 
           | ./screensaver.sh: line 79: mapfile: command not found 1 .
           | 
           | (Press ^C to exit)
           | 
           | Choose your screensaver: 1 404 Screensaver Not Found:
           | 
           | Oh no! Screensaver had trouble! Error code: 1
        
             | seba_dos1 wrote:
             | Get a Bash that's not ancient. mapfile is there since
             | version 4.0 from 2009.
        
             | SeeManDo wrote:
             | Seems to be a old version of bash installed and used by
             | default on macos
        
               | SeeManDo wrote:
               | Even after updating still getting the same error
               | 
               | checked active bash version:
               | 
               | echo $BASH_VERSION
               | 
               | 5.3.3(1)-release
        
               | seba_dos1 wrote:
               | What's relevant is whether "/usr/bin/env bash" runs the
               | correct one.
        
               | kridsdale3 wrote:
               | I used "brew install bash && brew info bash" to get the
               | path, then ran that shell (zsh doesn't work), then inside
               | that new bash, ran the screensaver app.
               | 
               | I found the 4k fullscreen perf in iTerm2 to be not-great,
               | so I did it again in the kitty (GPU powered) terminal
               | macos app, and it was good.
        
         | 30minAdayHN wrote:
         | I encountered this in another project. This should hopefully
         | fix it:
         | 
         | zmodload zsh/mapfile
        
         | doodpants wrote:
         | After installing bash via MacPorts, it works for me. All except
         | #3 cutesaver, which gives an infinite loop of:
         | cutesaver.sh: line 55: shuf: command not found
        
           | seba_dos1 wrote:
           | shuf has been a part of coreutils since 2006.
        
         | hinkley wrote:
         | IIRC macOS is at least one major version behind in bash.
        
           | dylan604 wrote:
           | something something licensing something something
           | 
           | new installs default to bash _not_ being the default
           | terminal. someone else mentioned macports, but there 's a new
           | version available via brew as well
        
             | hinkley wrote:
             | So far I have resisted the change. All the people I know
             | who think zsh is great have a fairly large number of addons
             | to get it that way.
        
               | dylan604 wrote:
               | This first time I used a mac where zsh was the default, I
               | was confused for quite a bit of time when it would not
               | run something I was used to doing. I kept looking up
               | errors on the internet until I came across someone's post
               | with a reply asking if they were using Terminal on a new
               | OS X. Sure enough, this was a new mac as well. Now I know
               | one of the first steps for me with a new Mac is change
               | default shell. I'm way too old and set in my ways to care
               | to learn a new shell. Choosing a shell, IDE, font, etc
               | are games for youth.
        
               | hinkley wrote:
               | I learned to consistently use shebangs at the top of
               | scripts while working with the first zsh user I knew. Or
               | might have been fish. No i think he started in zsh and
               | moved to fish. Every time I forgot, his environment was
               | busted. And he sat a cubicle and a half away from me, so
               | I got fast feedback.
        
               | dylan604 wrote:
               | Just last week I found myself trying to explain shebang
               | to someone that knows nothing of coding, command line
               | interfaces, or what shells are. At one point, I was
               | wondering where it was I should have stopped talking, but
               | it was definitely well before I finished.
        
       | huhtenberg wrote:
       | For the 'life' screensaver it might make sense to use half blocks
       | as a base rendering unit. ASCII 220 and 223.
        
       | Evidlo wrote:
       | Why does the cursor flicker around the screen for most of these?
       | Does it have something to do with not double buffering the
       | display?
        
         | attogram wrote:
         | Some artifact from asciinema maybe. Only shows up in the
         | preview gifs. Needs to be fixed!
        
       | PessimalDecimal wrote:
       | I've used Emacs for years but just recently learned about
       | zone.el. I wonder if this is based on it too. I see some of the
       | same screensavers here.
        
         | blenderob wrote:
         | Wow! The copyright of zone.el goes back to 2000. But this is
         | the first time I hear about it! How did you find this gem?
        
           | PessimalDecimal wrote:
           | It got mentioned briefly in an article in Mickey Petersen's
           | excellent Mastering Emacs blog.
        
           | LukeShu wrote:
           | I know the trendy thing is to hide the menu-bar, but it's
           | great for discoverability. Tools-Games-Zone Out
        
       | hk1337 wrote:
       | This reminds me of having a screensaver in DOS.
        
         | adzm wrote:
         | I thought the same thing. I remember being in elementary school
         | and seeing one of these terminate-and-stay-resident / TSR joke
         | things that made the smiley face ascii character bounce around
         | the screen. That led me to finally move on from Pascal and dive
         | into C to make one of my own, though I'm pretty sure it would
         | be possible in Pascal, all the (very obscure) information I
         | could find as a child used C examples. When I finally had one
         | running that would "Moo!" at random places I felt like a real
         | hacker.
        
       | LocoPadre wrote:
       | Recommendation: Use the terminal control codes 1049h and 1049l
       | [1][2] to keep the terminal 'clean'.
       | 
       | [1]:
       | https://en.wikipedia.org/wiki/ANSI_escape_code#Control_Seque...
       | 
       | [2]: https://unix.stackexchange.com/a/789031
        
       | throwaway2037 wrote:
       | How can anyone have a bad day when great projects like this pop
       | up on the front page of HN?
       | 
       | Did you see the library of viz? https://github.com/attogram/bash-
       | screensavers/blob/main/libr...
       | 
       | My favourite API: lov_die_with_honor()
        
         | axiolite wrote:
         | With "matrix" causing bash to consume 46% of my CPU time, I
         | think I'll pass. I think I can play the actual film in 4K with
         | less CPU time than that.
        
       | panki27 wrote:
       | For tmux users: you can use the lock-command option with
       | something like cmatrix for a quick and dirty screensaver.
        
       | _def wrote:
       | unfortunately quite inefficient, I'm sure higher framerates must
       | be possible
       | 
       | (at least when running in docker, maybe that's the bottleneck,
       | but I hesitated to run this on my machine directly)
        
       | imiric wrote:
       | Nice! I won't use this since screensavers are much more
       | interesting when not limited to characters, but this is a neat
       | project.
       | 
       | Screensavers are a lost art. I still enjoy them, but at some
       | point we just gave up on them. In the era of CRTs they had a
       | practical purpose (they're screen _savers_ , after all), but
       | modern OLED displays also suffer from burn-in for which
       | screensavers would be useful. My enjoyment is purely aesthetic,
       | though. Sometimes I just want to have something pleasing to
       | glance at in the background, instead of a black screen.
       | 
       | Nowadays most operating systems and desktop environments don't
       | even support them. The state of the art on Linux still seems to
       | be `xscreensaver`, which does have many great ones, but the
       | collection is static, and most of it is visually stuck in the
       | 90s. I wouldn't even try getting it to run on Wayland, and when I
       | last looked into it, it required some hacks and 3rd-party tools.
       | 
       | Also, I've always found the feature of screen locking and screen
       | saving to be orthogonal. Often I want to see pretty graphics
       | without locking my screen, and viceversa.
        
       | corranh wrote:
       | Very cool! Reminds me of the various 90s movie pretend hacker
       | typing screensavers like Neo-HackerTyper.
        
         | seba_dos1 wrote:
         | Check hollywood out then:
         | https://github.com/dustinkirkland/hollywood
        
       | nickstinemates wrote:
       | You can also experiment and make your own[1] using
       | TerminalTextEffects[2]. I added this to my ~/.zshrc
       | > /home/keeb/code/projects/login/motd.sh
       | 
       | Which has..                   #!/usr/bin/env zsh
       | values=("bubbles" "slide" "beams" "rain" "pour" "synthgrid"
       | "unstable" "poop")         len=${#values[@]}         index=$((
       | (RANDOM % (len - 1)) + 1 ))         selected=${values[$index]}
       | cat /home/keeb/code/projects/login/motd | tte $selected
       | 
       | Change motd to have an ascii art of your choice. Run it in a loop
       | if you want :)
       | 
       | 1: https://keeb.dev/static/login.mp4 2:
       | https://github.com/ChrisBuilds/terminaltexteffects
        
       | skeptrune wrote:
       | I love seeing projects like this on the front page. They are so
       | fun and can be little small tricks that improve your quality of
       | life drastically.
        
       | jsmailes wrote:
       | I like how all the tests seem to be contained within a "jury"
       | folder which judges the merit of your code, made me smile - It's
       | always nice for open-source/FOSS projects to retain a bit of
       | whimsy and joy.
        
       | culebron21 wrote:
       | In the good ol' days, ~1990, Norton Commander had a screensaver
       | with stars, similar to the one in the gallery readme, but with
       | fewer stars, that grew from a dot to bigger dot, to shining, then
       | bursted. Nice to see something like that again.
        
       | lucideer wrote:
       | Nice!
       | 
       | First feature request: allow disabling all the `tput setab 0`
       | calls throughout the codebase. This may make screensavers look
       | weird on white terminals but should improve them for anyone using
       | non-black-but-dark terminal themes.
        
         | o11c wrote:
         | Related: the `COLORFGBG` variable and the `tput el` sequence.
        
       | rkapsoro wrote:
       | fwiw I've noticed that Omarchy[1] uses some terminal-based
       | screensavers, using something called tte[2] to do so.
       | 
       | 1: https://omarchy.org/
       | 
       | 2: https://github.com/ChrisBuilds/terminaltexteffects
        
       | ratelimitsteve wrote:
       | ive always wanted to build something like this for divination, an
       | X by Y field in which each cell is randomly assigned a character
       | from a set which refreshes on a tick that you're meant to just
       | gaze on and look for spontaneous patterns in, maybe with some
       | conway game of life style rules about how cells can be more or
       | less likely to update based on the states of their neighbors.
       | Fork incoming.
        
       | LeoPanthera wrote:
       | Of course, if used as an actual screensaver on a phosphor or
       | plasma based screen, eventually the character grid would be
       | burned into your screen.
       | 
       | A lot of screensavers, even historically, forget the original
       | purpose of what "saving" your screen means.
        
       | dakinitribe wrote:
       | Never a nice surprise when I find rm -rf / --no-preserve-root in
       | a public repo, apart from this time!
       | 
       | Also, found one of the easter eggs!
        
         | attogram wrote:
         | Good catch!
         | 
         | For folks curious about the rm -rf see
         | https://github.com/attogram/bash-screensavers/blob/main/gall...
         | line 339
        
       | dorianmariecom wrote:
       | a simple one:                   #!/usr/bin/env bash
       | _cleanup_and_exit() {           tput cnorm           tput sgr0
       | clear           exit 0         }              trap
       | _cleanup_and_exit SIGINT              while true; do
       | width=$(tput cols)           height=$(tput lines)
       | tput setab 0           clear           tput civis
       | x=$((RANDOM % width + 1))           y=$((RANDOM % height + 1))
       | color_code=$((RANDOM % 256))                printf
       | "\e[${y};${x}H\e[38;5;${color_code}m"                sleep 1
       | done
        
         | axiolite wrote:
         | Just an empty screen here... You're picking random positions on
         | screen, and random colors, but then you don't display ANY text
         | so the info is discarded and cells remain clear.
         | 
         | After the printf, perhaps you want: tput smso; echo -n " "
         | 
         | Then I find moving the second "clear" before the "while" makes
         | it more interesting. Not sure if that's more like what you
         | intended.
        
       | Agingcoder wrote:
       | Why bother with Xwindow when you can have this ?
        
       | prmoustache wrote:
       | Do screens still need to be saved?
        
         | blacksmith_tb wrote:
         | OLEDs are famous for burning in[1], so potentially "yes".
         | 
         | 1: https://www.pcworld.com/article/2918628/your-oled-
         | displays-w...
        
           | prmoustache wrote:
           | Don't tell me they burn when showing nothing or going to
           | sleep?
           | 
           | We used to have screensavers with CRT because it took them a
           | lot of time to power on and most early CRTs didn't have power
           | saving capabilities so showing something wasn't significantly
           | worse than having a black screen in term of power usage.
        
       | jedberg wrote:
       | I've never seen a repo that invites AI coders and then tells them
       | how to behave [0]. I imagine we'll see more of this in the
       | future.
       | 
       | [0] https://github.com/attogram/bash-
       | screensavers/blob/main/AGEN...
        
         | chrysoprace wrote:
         | AGENTS.md is an attempt to standardise around the different
         | conventions each of the agents uses[0]. It's an initiative by
         | OpenAI. Anthropic don't seem to be in a hurry to support it
         | though[1], possibly to maintain some kind of walled garden, but
         | that's purely speculation on my part.
         | 
         | [0] https://agents.md/
         | 
         | [1] https://github.com/anthropics/claude-code/issues/6235
        
       ___________________________________________________________________
       (page generated 2025-10-28 23:01 UTC)