Features

All of it, on one page.

The home page tells the highlights. Here is everything bateri does, by topic.

The input dock

At the bottom, in its own place
The line you type sits at the bottom of the window, with your folder and git branch beneath it.
Multiple lines
The line wraps; ⇧⏎ adds a line without running it, and the dock grows with it.
Mouse selection and editing
Select, type over, delete; or use ⇧ and the arrows.
A gliding caret
It moves with spring physics; block, underline or beam. Or have it snap into place.
Typing and erasing effects
Letters pop in, erased ones shatter or recede; all adjustable, all optional.
The dock's arrival
In a new tab the dock holds back its folder, branch and caret until the shell gives its first prompt, then arrives: its top line ripples and the prompt mark drops onto it, specks of dust are drawn onto the line, or the folder and branch type themselves out. A quick shell never flickers, and a key ends it at once. Pick one, or turn it off, in Settings ▸ Motion ▸ Dock arrival.
Steps aside
While a program that reads the keyboard itself runs — vim, Claude Code, codex, python3 — the dock steps aside and returns at the prompt. The terminal's size doesn't change, so nothing has to redraw.
Your dotfiles stay yours
The zsh integration loads through ZDOTDIR; your own startup files run as usual.
Classic, if you prefer
integration = "blocks" removes the dock and keeps the command blocks; "off" turns it all off. bash and fish support is on the way.

Commands and history

Command blocks
Each prompt and its output form a block; the mark in the gutter shows how the command ended.
Duration
Commands that take longer than a second show their duration, counting while they run.
Search the scrollback
⌘F: case-sensitive and regular-expression modes and a live match count; ⌘G for the next.
Clickable links
Hold ⌘ and URLs, existing files and folders and OSC 8 links are underlined; ⌘-click opens them. Paths with spaces and bare names from ls are found too.
Right-click a link
Open, Reveal in Finder and Copy. OSC 8 links show a dashed underline even without ⌘, with their target in the corner.
Clear
⌘K clears the screen and scrollback, ⌥⌘K only the scrollback.
A scroll bar
A thin bar shows at the right edge while you scroll and fades about a second after you stop; output arriving below never brings it up. Point at it and it widens: drag the thumb or click the track. By default it follows the system's Show scroll bars; it can also stay up beside the text, or never show.
Your commands on the bar
The wide bar marks every command in your history in its mark's color: point at one for the command, its exit code, how long it ran and when it started; a click brings it into view. While a search is open its matches are on the bar too, the current one brightest.
Jump to latest
When output arrives below a window you've scrolled up, a Jump to latest button at the bottom right says how many new lines came; a click glides you back to the bottom.
Scrolling that follows your finger
The trackpad is tracked pixel by pixel and momentum ends with the system's own deceleration; new output settles to the bottom.

Context

The ssh status bar
Over ssh or mosh the dock shows the machine's name and the remote folder, colored by your mark: production red, staging yellow, development green.
Interpreters
Python, Node, Bun, Deno, Ruby (irb, pry), ipython and bpython: which version, which manager (venv, conda, pyenv, uv, nvm, volta, fnm, asdf, rbenv, mise) and from where, with the way out on the right.
Databases
psql, mysql, mariadb, sqlite3, redis-cli and mongosh name the server they're connected to. A password is never shown, however you passed it, and the server is colored by your marks.
Containers and Kubernetes
docker and podman run/exec, compose exec; kubectl exec, run and debug: the image, the container or the cluster's context, the namespace and the pod.
Root is always red
After sudo -i, sudo -s or su the shell is red, whatever your marks say. A nested shell started from the prompt says so too.
Mark it from there
Shell ▸ Mark “host” as marks the server, the database or the cluster right where you are.

Remote servers

Drop to upload
Drop a file or folder from Finder: bateri first asks what goes where and how big it is, says Replace or Merge when a same-named item exists, and sends nothing when there isn't room. Then it uploads to your remote folder, with progress, cancel (⌘.), a summary and a notification when you're elsewhere.
⌘-click to preview
A temporary read-only copy downloads and opens; large files (100 MB by default) ask first. Previews clean themselves up, and one you edited moves to Downloads instead of being deleted.
⌘-drag to download
Drag a file or folder to Finder or the Desktop. Right-click for Download to Downloads, Download To…, Copy Path and Copy as scp Path.
One transfer list
Downloads and uploads share one list; downloaded files carry macOS's usual “downloaded from the internet” mark.
Folder and blocks, on their own
On the first prompt the remote folder appears and follows cd; remote commands get their stripe and duration. For this bateri writes a few small files under ~/.local/share/bateri on the server and leaves your rc files alone. zsh, bash or fish on the server; off by itself on production-marked servers and inside a local tmux.
Server load
On Linux servers, CPU and memory in the status bar with a small graph of the last eight samples, turning yellow or red past a threshold. Click for cores, load average, memory, disk, uptime and the top three processes.
Password servers
bateri asks once and can keep it in your Keychain; while your ssh session is open, or in a second tab, it doesn't ask again.
Servers without a shell
Routers, Windows or git@github.com are recognized on the first try; the connection quietly reopens as plain ssh.
Remote clipboard
A program on the server can write to your clipboard with OSC 52, and recognizes bateri through LC_TERMINAL.

Continuity

Updates keep programs running
Shells, vim, npm run dev and ssh sessions — Claude Code on a server included — carry on in the new version with their screens. A transfer or a password prompt makes the update wait.
Crash-proof
If bateri crashes or is force-quit, your programs wait for their windows; the next launch brings back the same processes with their screens and scrollback. Nothing is written to disk for it.
Even through ⌘Q, if you like
With keep_running = "quit", quitting ends nothing and a notification names what's still running. ⌥⌘Q quits and ends them.
Windows come back
After quitting or a restart: windows, tabs and splits, each pane in its folder, at its font size, with its scrollback in color. A pane that was on ssh comes back with its ssh … line typed and waiting for ⏎.
After a power cut too
The layout is kept on disk while bateri runs, so windows reopen even after a crash or a power cut.
A clean start
Hold ⇧ while opening bateri for one empty window. A restore can never trap you in a crash loop.
How much is kept
restore_windows: "all", "layout" (no scrollback on disk) or "off".

Windows

Tabs in your theme
Tabs sit in the title bar beside the traffic lights, drawn in the theme's colors instead of the system's grey, with + at the right end. A window with one tab looks as before, its title in the middle. ⌘1–⌘9, ⇧⌘[ ⇧⌘] and ⌃⇥ switch tabs; hold ⌘ to see the key that reaches each one.
Each tab shows what goes on in it
A ring turns while a command runs, on the far end of ssh too. A command that finishes while you're in another tab leaves a green tick, one that fails a red dot; a transfer shows an arrow and fills a line along the bottom, a marked host colors a line along the top. Full-screen programs such as vim turn no ring; one that reports its status, as Claude Code does, turns it only while it works and shows a ? when it's waiting on you. Rest the pointer on a tab for a card: its folder, its last command and how long it took, a transfer, the host.
Drag it, move it
Drag a tab along the row to put it in a new place, pull it out into a window of its own, or drop it on another bateri window's row. Right-click for Move Tab to New Window and Close Other Tabs; Window ▸ Merge All Windows gathers every window's tabs into one. Nothing restarts: the shell, the running command and any question it was asking go with the tab.
Name them, scroll them
Double-click a tab to name it; the name is kept through quitting, relaunching and updates. When the tabs no longer fit, the row scrolls and fades at its edges; ⇧⌘\ lists them all.
Questions wait in their tab
A question a background tab asks (a password, an upload's confirmation) waits until you switch to that tab instead of covering the one you're looking at, and the tab shows a ? in a ring. One you left half typed is there as you left it when you come back.
Splits
⌘D splits right, ⇧⌘D down. Move with ⌘[ ⌘] or ⌥⌘ + arrow, resize with ⌃⌘ + arrow; ⌃⌘= equalizes, ⇧⌘↩ zooms.
Splits as cards
With two or more panes, a tab's panes stand as cards on a ground of their own: a soft gradient drawn from your theme's accent and cursor colors, a gap round and between them, corners rounded to match the window's. The focused card stands nearer and no pane is dimmed. Settings ▸ Appearance ▸ Split style ▸ Lines lets the panes touch with a one-pixel line, for the most room for text; Dim unfocused splits brings the veil back.
Move a split anywhere
Hold ⌥⌘ and the panes lift, each with a small bar on top. Drag a pane by its bar, or by any point while the keys are held, and drop it beside another pane, on any side, or in its middle to swap the two; along the window's edge it becomes a full-height column or a full-width row. Before you let go, the place it would take is painted and labelled (Left, Right, Above, Below, Swap), and room is made by shrinking the panes around it, none below 20 columns by 5 rows. Esc puts it back.
Across tabs and windows
Drop a pane on another tab's chip to add it to that tab, or hold it there to open the tab and place it yourself; between two chips it becomes a tab of its own. Drag it out of the window and it opens in a new one; drop it on another bateri window and it moves there. The program in it keeps running and is resized once, when it lands.
Pull a tab in, take it back
With ⌥⌘ held, drag a tab's chip down onto the open panes and the whole tab comes in as splits, keeping its layout; or right-click it for Merge into Current Tab. Edit ▸ Undo Move (⌘Z) takes back the last move, swap or merge.
Drag and drop
Drop a file from Finder and its path lands on the line, safely quoted.
Asks before closing
With a process running, ⌘W or ⌘Q asks once per gesture.
From ssh to a local tab
In an ssh tab, ⌥⌘T opens a local one.

Text and drawing

Drawn on the GPU
Every frame is drawn on the GPU through Metal, talking to AppKit directly; no Swift or web layer in between.
Zero idle frames
When nothing on screen changes, no frame is drawn. Not a wish: a gate the tests guard.
Emoji and wide characters
Flags, ZWJ families, skin tones; CJK across two cells — in the dock too.
Lines drawn by the terminal
Box-drawing, block and Braille characters are drawn by the terminal, not taken from the font; htop's frame stays in one piece.
A box, or the whole glyph
A character missing from your font comes from the system, but it's never half-clipped.
Letter and line spacing
Down to 0.5; accents reach into the next line while box-drawing stays joined.
A soft top edge
Where the terminal meets the tab bar or a split's divider, a line scrolling up fades out over a few pixels instead of being sliced through its letters; the first line of a screen at rest always stands fully readable. Or choose a thin line, or the plain cut: Settings ▸ Appearance ▸ Content edge.
Reduce Motion
All motion follows the system's Reduce Motion setting.

Keyboard and mouse

International keyboards
Dead keys work (~, `); ⌥← ⌥→ jump by word, while ⌥-letters still type what your layout says.
Mouse selection
Double-click a word, triple-click a line; ⇧-click moves the end of the selection.
The mouse goes where it's wanted
vim, htop and Claude Code receive clicks; hold ⇧ and selection is always yours.
Paste as one argument
⌃⌘V pastes the clipboard as a single escaped argument.
Font size
⌘+, ⌘− and ⌘0.

Settings and updates

One file
~/.config/bateri/settings.toml applies the moment you save it; every key is optional.
Settings window
⌘, opens a window that edits the same file.
Themes
TOML files in ~/.config/bateri/themes, chosen from View ▸ Theme. The default follows the system's light and dark mode; linen is a warm light one: warm ink on a cream background with a burnt-orange cursor.
Updates itself
From GitHub Releases, through Sparkle: it checks once a day and asks before installing. Every update is signed with EdDSA and verified before it's installed.
Privacy
There's no update server of our own, and nothing but the version check is sent.
Free software
Licensed under GPL-3.0, with the source on GitHub. Signed with a Developer ID and notarized by Apple, so it opens without a warning.

Keyboard shortcuts

Hold ⇧ to select text with the mouse inside programs that capture it, such as vim.

ActionShortcut
New tab / new window ⌘T/⌘N
Local tab from an ssh tab ⌥⌘T
Go to tab ⌘1 … ⌘9
Previous / next tab ⇧⌘[/⇧⌘]
Show all tabs ⇧⌘\
Split right / split down ⌘D/⇧⌘D
Previous / next split ⌘[/⌘]
Select split in a direction ⌥⌘ + ←↑↓→
Resize split ⌃⌘ + ←↑↓→
Equalize splits / zoom split ⌃⌘=/⇧⌘↩
Swap split in a direction ⇧⌥⌘ + ←↑↓→
Move split to previous / next tab ⇧⌥⌘[/⇧⌥⌘]
Lift splits to move them (hold) ⌥⌘
Undo move ⌘Z
Close pane or tab / close window ⌘W/⇧⌘W
Find / next / previous ⌘F/⌘G/⇧⌘G
Top / bottom of the scrollback ⌘Home/⌘End
Page up / down ⌘PgUp/⌘PgDn
Clear screen and scrollback / scrollback only ⌘K/⌥⌘K
Paste as a single escaped argument ⌃⌘V
Bigger / smaller / actual size ⌘+/⌘−/⌘0
Cancel upload ⌘.
Settings ⌘,
Quit and end programs ⌥⌘Q

Requirements

macOS 14 or later
Apple silicon
zsh for the input dock
macOS's default shell; bash and fish are on the way.
Remote command blocks
zsh, bash or fish on the server.
Uploads to a server
tar on the server.
Server load
Linux servers.

Download bateri

Free and openly licensed. Open it and your zsh arrives as usual; bateri handles the rest.

Download for macOS

macOS 14 or later, Apple silicon · Free software, GPL-3.0