A box, or the whole glyph
A character missing from your font comes from the system, but only if the pixels it paints fit the cell. A half-clipped letter is silent damage; a box is an honest gap.
Drawings
Every surface in bateri began as a written decision. This set is a selection of them: the drawing, the measurements and the reasoning. No number was made up; they come from the source code.
A-01
Under the AppKit window, a frame passes through eight Metal pipelines: backgrounds, the dust and the wave of the dock's arrival, glyphs, emoji, selection, typing effects and the caret. Each draws its own layer; when nothing on screen changes, none of them run.
A-02
The tabs are bateri's, not the system's: drawn in the title row, in the theme's colors. The row is 40 points; the strip starts 12 points right of the traffic lights, and each tab is at most 184 points. + is rounded to sit in the window's 20-point corner.
A tab carries one sign, the most urgent: a question waiting, a command running, how a command ended while you were away, a transfer. Failure outranks success, because it's the one you mustn't miss. A marked server is a thin line along the tab's top. A program that reports its own status, as Claude Code does, turns the ring only while it works and shows the question while it waits for you.
The ring doesn't spin, it steps 30° once a second: the clock wakes only when something is about to change, and not at all while the window can't be seen. A window with a single tab shows none of this; its title sits in the middle.
A-03
With two or more panes in a tab, every pane is a card on a ground of its own. No line draws a card: it reads as one by depth, with light from above. Its top edge catches the light, a dark card has a faint sheen under it, and its shadow is tucked under its foot instead of spreading over the ground.
The ground isn't a new color but one derived from four: the background lifted a step toward the foreground, leaning toward the accent at the top left and toward the cursor's color at the bottom right. Every theme gets its own.
8 points between the cards and around them, none at the top: they start right under the title row. A card's corner is the window's less the gap, so the gap is as wide at the corners as along the edges. The focused card stands nearer, and no pane is dimmed.
A-04
Hold ⌥⌘ for 300 milliseconds and the tab's panes lift, 3% smaller (1.5% under the pointer), each with a capsule: its hold, what it's doing, its name and folder, and four tools. As a pane narrows, the capsule drops the folder, then the name, then the split tools.
Carried over another pane, nothing moves until you let go; the place it would take is painted and labelled Left, Right, Above, Below or Swap. More than 28% in from every edge is the middle, a swap; nearer an edge, it goes beside. An 18-point strip along the window's edge makes a full-height column or full-width row, two fifths of the window.
Room is made by shrinking the panes around it, none below 20 × 5. The program is resized once, when it lands; the panes slide there in 200 ms.
A-05
The grid's unit is the cell, not the letter. A letter sits in the middle of its cell on a fixed baseline; open up the line spacing and the letter stays where it is.
Box-drawing lines aren't taken from the font: the terminal draws them itself, from one edge of the cell to the other, so no hairline gap opens between rows. A wide character takes two cells and is never split down the middle.
Example setting: SF Mono 14 pt, line height 1.2. The default is 13 pt and 1.0; the rule doesn't change.
A-06
The dock lives in its own band at the bottom of the window. Locally the band is 72 points: the input row, the context row and the space around them.
Over ssh the band shrinks to one row, 36 points, and its top line takes the color of the server's mark. The terminal's size doesn't change: the grid just moves down, and no program has to redraw.
A-07
In a new tab the dock stays empty until the shell gives its first prompt: the folder, branch, prompt mark and caret are held back. Nothing moves for the first 0.18 seconds, so a quick shell never flickers; after that, only the top line ripples faintly.
When the prompt comes, the scene is over in 0.56 seconds: the ripple settles, a wave runs right from the ›, the middle line is drawn from the left, the folder and branch appear, and the caret comes last.
If the shell says nothing for 3 seconds, the dock arrives anyway. A key press, or leaving the window or tab, ends the scene at once; with Reduce Motion it's a 0.12-second fade.
A-08
The caret doesn't teleport; it travels on a critically damped spring: it speeds up, slows down, and never overshoots. The stiffness, ω = 30, is a chosen number, not a measured one.
Because the thresholds are absolute, settling time grows with distance: about 230 ms for one cell, about 460 ms for 400 cells. These weren't measured; they were computed from the closed form. The 0.7-second ceiling isn't a duration, it's a seat belt.
A-09
The caret isn't a flat rectangle but a distance field (SDF): rounded corners, a soft edge. Its corner radius is a share of the cell's height, 0.10 by default, so it keeps its proportions at any font size; at 0.5 it becomes a pill.
The halo lives only outside and is as light as a box shadow: two fifths of the side margin, 10% at its darkest. The first version glowed like neon; cursor_glow scales spread and darkness together, as one feeling.
Out of focus the caret is an empty outline. The selection has its own corner, 0.22. Blinking is off by default: on, an idle window would draw two frames a second.
A-10
A typed letter arrives in 240 ms. The first choice was 120 ms; in a real window the effect turned out to be invisible, and the duration doubled.
A deleted letter takes a notch longer, 300 ms, to go: the eye reads what was erased, while it already knows what it typed.
A-11
A theme is twelve roles; every key is optional, and a missing one comes from the built-in theme. The caret is the gold of the icon.
Status colors are meaning, not decoration: success green, error red. A server you've marked production is red, staging yellow, development green, unmarked cyan. A running command is blue.
A-12
Small decisions, enlarged: what happens when a letter doesn't fit its cell, what's drawn when the screen is still, and where box-drawing lines come from.
A character missing from your font comes from the system, but only if the pixels it paints fit the cell. A half-clipped letter is silent damage; a box is an honest gap.
When nothing on screen changes, no new frame is drawn, and your battery and fans notice. It isn't a wish: it's a measured gate, and a change that breaks it turns the test red.
Box drawing, block and Braille characters are drawn by the terminal, not taken from the font. No hairline gaps between rows; htop's frame stays in one piece.
Free and openly licensed. Open it and your zsh arrives as usual; bateri handles the rest.
Download for macOS