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.
| Action | Shortcut |
|---|---|
| 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