drift: a terminal screensaver that takes over when you stop typing
Terminal screensaver that activates when you're idle, constellations, rain, particles & more. Press any key to resume. Just drift away!
At a glance
- What is it?
- drift is a Go program that watches for idleness in your shell and fills the terminal with animated ASCII scenes, from braille sine waves and rain to Conway's Game of Life and a flocking simulation, across fourteen scenes and ten colour themes. It is MIT licensed, cross platform, and its Windows build is the one platform where the idle detection does not work, so there you run it by hand.
- Who is it for?
- Adopt drift if you want a terminal that goes ambient when you walk away, if you enjoy ASCII animation, and if your shell is zsh, bash or fish on macOS or Linux. Do not adopt it on Windows expecting the idle trigger, because the README states shell integration is not available there, and do not treat it as a security control, since it is a display program and not a screen locker.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 7 days ago.
- What is it written in?
- Mainly Go, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
Idle detection is what makes it a screensaver
drift is described as a terminal screensaver that activates when you are idle, and the README is more specific about what it is for: a terminal screensaver that turns idle time into ambient art.
That distinction matters, because a program that draws a pretty animation in a terminal is a small project, and a program that detects that you have stopped interacting and takes over the screen is a different problem. The trigger is handled by shell integration, and the README says plainly that this is what makes drift a real screensaver: your shell detects idleness and launches drift automatically, and you press any key to return to your prompt.
The audience is narrow and obvious. Terminal users who spend time in a full screen program, step away from the keyboard, and would rather look at drifting braille waves than at a frozen shell buffer. The topics list the vocabulary of the field: animation, ascii, cli, go, golang, idle, screensaver, tcell, terminal, tui and unixporn.
The implementation is Go, the licence is MIT, the default branch is main, and the project is not archived with the last push on 2026-10-16. The releases are v1.3.0 from 2026-09-10, v1.2.0 from 2026-09-04 and v1.1.0 from 2026-05-12.
The binary is a single static program. The README is explicit that Go 1.23 or newer is required and that no C compiler or CGO is needed, which matters for anyone who wants to drop it on a machine without a toolchain, and the go.mod itself declares Go 1.24.0 as the module version.
Fourteen scenes, drawn in braille and box characters
The scene list is the substance of the project, and it reads like a catalogue of terminal animation traditions.
waveform is braille sine waves that breathe. constellation is stars that drift and connect to each other. rain drops katakana characters in columns. particles is a flow field of drifting glyphs. pipes sends box-drawing pipes snaking across the screen and wrapping at the edges. maze builds a perfect maze, holds it, then dissolves and regenerates it. life is Conway's Game of Life, where cells flash bright on birth, age through the palette, and reset when the grid stagnates. clock shows the current time in large braille digits with the date below. orrery is a stylized solar system with a fixed sun, concentric orbit rings and braille-rendered planets. starfield is the classic 3-D star warp, with stars accelerating toward you from the centre and leaving trails. dvd is the bouncing logo, changing palette colour on each wall bounce and flashing bright on a corner hit. boids is a Reynolds flocking simulation, with triangle-arrow heads leaving fading trails as separation, alignment and cohesion steer the flock. plasma is a demoscene sine-sum colour field made of four overlapping waves with a drifting radial centre. bonsai is a leaning, tapered trunk growing out of a shallow pot and spreading flat foliage pads.
The technique is worth noticing. Braille characters are used as a pixel grid, so a character cell carries a two-by-four dot matrix and a scene can look far more detailed than the character count suggests. That is why a clock can be shown in large braille digits and why a maze can be drawn as a perfect structure in a terminal. Box-drawing characters do the same job for pipes.
The scenes cycle automatically, or you can lock to one, which is the difference between a screensaver and a demo you actually want to look at.
Ten themes, and one that follows your terminal
There are ten built-in themes, matched to popular terminal colour schemes, and the list is short enough to be worth naming: cosmic, nord, dracula, catppuccin, gruvbox, forest, wildberries, mono, rosepine and ansi.
The ansi theme is the interesting one. It uses your terminal's own 16 colours, so it follows your colour scheme. That is a different behaviour from the other nine, which hard-code a palette, and it is the one to pick if you have spent time on a colour scheme you like and do not want drift to override it.
The others are named after well known schemes, and the scenes are written to sit well with a saturated background, since most of the effects described, dithering, plasma colour fields, star trails, flashing cells, involve bright output on a dark field.
The CLI can show you what you are choosing. This command previews all themes with colour swatches:
: drift list themes # preview all themes with color swatchesand there is a matching drift list scenes for the scene list. The interactive browser mode opens over all scenes and themes, which is the fastest way to find the combination you want before you wire it into your shell.
Shell integration in zsh, bash and fish
The idle detection lives in your shell configuration, and the setup is two lines per shell.
For zsh, add this to your .zshrc:
# add to ~/.zshrc
export DRIFT_TIMEOUT=120 # seconds of inactivity (default: 120)
eval "$(drift shell-init zsh)"For bash, the same in .bashrc:
# add to ~/.bashrc
export DRIFT_TIMEOUT=120 # seconds of inactivity (default: 120)
eval "$(drift shell-init bash)"And for fish, in the file .config/fish/conf.d/drift.fish:
# add to ~/.config/fish/conf.d/drift.fish
set -x DRIFT_TIMEOUT 120 # seconds of inactivity (default: 120)
drift shell-init fish | sourceThe pattern is the same everywhere: the shell-init subcommand emits the code that installs the idle check, and the shell evaluates or sources it. The timeout is 120 seconds by default, and the comments make the unit explicit.
That default is the first thing to change. Two minutes of inactivity is a short window, and it will catch you during a meeting where you are sharing your screen and reading chat, not just when you have walked away. Setting DRIFT_TIMEOUT to something like 600 gives the screensaver its intended behaviour, which is to catch a genuinely abandoned terminal.
Windows is the exception the README calls out. Shell integration is not available on Windows, and there you run drift directly from any terminal, Windows Terminal, PowerShell or cmd, to start it immediately, or use the interactive browser mode to browse scenes and themes, and you press esc to exit. So on Windows the tool works, but you start it yourself rather than letting it detect idleness.
Five ways to install it
The installation section offers six routes, and they cover the usual cases for a single static Go binary.
Homebrew, for macOS and Linux:
brew install phlx0/drift/driftThe AUR package for Arch, with paru named as an alternative:
yay -S drift-bin # or: paru -S drift-binNix, either as a run or as a flake input:
nix run github:phlx0/driftinputs.drift.url = "github:phlx0/drift";Pre-built binaries from the releases page, with archives for macOS on Apple Silicon and Intel, Linux on x86-64 and ARM64, and Windows on x86-64. The README gives the extraction step, and the drift version command is how you confirm it worked:
tar -xzf drift_darwin_arm64.tar.gz
sudo mv drift /usr/local/bin/
drift versionAnd from source, either with go install for the latest version:
go install github.com/phlx0/drift@latestwhich needs Go's bin directory on your PATH, and the README shows the export line for that:
# add to ~/.zshrc or ~/.bashrc
export PATH="$PATH:$(go env GOPATH)/bin"or by cloning and running go install . in the clone, which is what you would do if you want to read the source or patch it.
A small Go program with a well-organised repository
The dependency list explains most of the design. The go.mod requires BurntSushi/toml, gdamore/tcell/v2 at v2.13.10 and spf13/cobra at v1.10.2, with a handful of indirect dependencies including the Unicode width library and a colour library.
tcell is the terminal UI library that does the drawing, and it is the reason the braille rendering looks the way it does, since tcell handles the escape sequences for cell attributes and the terminal capabilities behind them. cobra is the command line framework, which is why the subcommands have help text and consistent flag handling. toml is the configuration format, so there is a config file the README does not show in detail.
The repository layout is conventional Go. There is main.go at the root, a cmd directory for the command definitions, an internal directory for the implementation, a packaging directory, a flake.nix for the Nix flake, a .goreleaser.yaml for the release build matrix, and a .golangci.yml for linting.
The Makefile shows how the project is worked on. The test target runs go test with the race detector and a count of 1, so tests are run fresh rather than from cache and races are checked. There are build, run, install, clean, setup and fmt targets, and a lint target that runs golangci-lint. The version is injected at link time with -X main.version, taken from git describe.
The demo directory is a detail worth noting. Each scene has a .tape file, which is the script format for a terminal recorder, and the Makefile has a demo target that runs vhs over those tapes to regenerate the demo GIFs. That means the screenshots in the README are reproducible artefacts rather than hand-made captures, and it means a contributor adding a scene has a defined way to produce its documentation.
Where drift is the wrong tool
The obvious limitation is that it needs a terminal, and specifically a terminal with a reasonable cell size, since the braille scenes lose their detail in a small window. It is also a program that takes over your terminal, so anything already running in that terminal is hidden until you press a key.
The second limitation is the idle detection itself. Because the trigger comes from shell integration, it fires when your shell considers itself idle at a prompt. A long running command in the foreground is not idle in that sense, so drift will not take over the screen while a build or a test run is going, however long that takes. If you wanted a screensaver that covers a machine you are working on remotely, or that engages over ssh, this will not do that.
The third is the platform gap. On Windows there is no shell integration, so the idle behaviour simply is not there, and the tool becomes an animation you launch by hand. For a user who lives in Windows Terminal that is a substantially different product, and the README does not pretend otherwise.
The fourth is what it is not. drift is a display program. It does not lock a terminal, it does not require a password to resume, and it does not protect the session in any way. It is the opposite of a security control, and anyone reaching for it to hide a screen from view should use a screen lock instead.
None of these make it a bad project. They make it a specific one: a Go program with a small dependency footprint, fourteen scenes that are genuinely worth looking at, and an idle trigger that works exactly as advertised on the three shells it supports.
Editorial conclusion
Adopt drift if you want a terminal that goes ambient when you walk away, if you enjoy ASCII animation, and if your shell is zsh, bash or fish on macOS or Linux. Do not adopt it on Windows expecting the idle trigger, because the README states shell integration is not available there, and do not treat it as a security control, since it is a display program and not a screen locker. Before you wire it into your shell, set DRIFT_TIMEOUT to a value you actually want, since the default of 120 seconds is short enough to interrupt a meeting where you are sharing your screen.
Frequently asked questions
How do I install drift on macOS or Linux?
The quickest route is brew install phlx0/drift/drift. Arch users can install the drift-bin AUR package with yay or paru, Nix users can run nix run github:phlx0/drift, and there are pre-built archives on the releases page for macOS, Linux and Windows.
How do I make drift start automatically when my terminal is idle?
Add the shell integration to your configuration. For zsh, put export DRIFT_TIMEOUT=120 and eval "$(drift shell-init zsh)" in your .zshrc, and there is an equivalent for bash and a fish variant. Shell integration is not available on Windows, where you run drift directly instead.
What scenes and themes does drift include?
It ships 14 scenes including waveform, constellation, rain, particles, pipes, maze, life, clock, orrery, starfield, dvd, boids, plasma and bonsai, with 10 built-in themes. The ansi theme uses your terminal's own 16 colors so it follows your colour scheme, and drift list themes previews them with swatches.
How long does drift wait before it activates?
The default is 120 seconds of inactivity, set with the DRIFT_TIMEOUT environment variable, and the comments in each shell snippet note the unit is seconds. The value is configurable in zsh, bash and fish, and the CLI also accepts a duration for how often scenes cycle.
What do I need to build drift from source?
Go 1.23 or newer, and no C compiler or CGO. You can go install github.com/phlx0/drift@latest, or clone the repository and run go install. in the clone. The licence is MIT, the last push was on 2026-10-16, and the newest release listed is v1.3.0 from 2026-09-10.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/phlx0-drift)Was this useful?