[layout] min_column_width puts that floor in your hands — drop it
and more, narrower columns become possible — and the picker now offers shapes with
room to grow into rather than only ones that match the windows open this second. Pinning a
window by hand outranks every rule, so a pin survives changing shape. Right‑click the
rail to trade two tiles or send one to a workspace, one‑handed, no modifier. And the
AI card reads Anthropic’s own limits list — the 5‑hour window, the weekly
one, and the weekly window for whichever model you are on — each with when it resets
and which one is actually binding, switched on from the ⚙ card rather than a config
file.Your windows tile themselves and never overlap — every one gets a slice, and the slices always add up to the whole screen. Two ways to cut it, drag-to-resize bars between every tile, focus-follows-mouse — wrapped in a working LCARS console: the frame around your windows lists them, switches workspaces, and reads out live CPU, memory, Wi-Fi and SSD telemetry. It is chrome that does something.
On the bridge
Zil running a real desk — a 49″ Odyssey G9 at 5120×1440: master-centre layout, the rail listing the crew with the NAV rosette below, stardate · weather · temperature in the bar, sensors live in the frame.
Download
Zil for macOS
Signed with a Developer ID and notarized by Apple — Gatekeeper opens it without warnings.
Zil needs the Accessibility permission to move and resize other apps' windows; it never asks for anything
else, and granting it on first launch is the whole setup. First run writes
~/.config/zil/zil.toml and takes over from there.
LCARS console for Omarchy
A quickshell bar plugin, not a window manager and not a port — Hyprland keeps doing the
tiling. Needs Omarchy with quickshell, Hyprland and fontconfig. The seven ship palettes are generated
from Zil's own Swift at build time, so the two consoles cannot drift apart. 0.2.0 brings
ZIL·DOC to Linux: the same document pane, and the same show_document MCP tool
for your agents. What crossed over, and what did not →
Systems
Bento tiling
Two layouts. Dwindle halves a neighbour with each new window, cutting whichever way keeps tiles squarest — no decisions from you. Master-centre holds your real work in the middle of a 32:9 desk with everything else in flanking stacks. Drag the orange bars; neighbours follow. See both layouts run →
Shapes and priorities
Click the layout pill for a card of desk shapes that fit the windows you have open — 2 | 1 1 | 2 is two stacked left, two wide centre columns, two stacked right — and pick one. Focus windows (terminals, editors) take the centre; ambient ones (chat, music, LCARS·TV) take the sides. ⇧‑click two rail rows to trade tiles; ⇧‑click a row then a workspace number to give that app its own workspace.
Nine workspaces
Per display, instant switching — no animation tax. ⌃⌥⌘1–9 to go, ⇧ to move a window, a clickable 1–9 strip on the rail. Layouts persist per workspace.
Tile profiles
Dial in an arrangement, save it under a name, recall it exactly — windows matched by app identity, so profiles survive relaunches and reboots.
Ship themes
Daystrom, Enterprise-D, Enterprise-E, Titan, Voyager — one keystroke rotates the whole console. Red alert mode pulses every surface in phase.
Live sensors
Per-core CPU bars, memory pressure, Wi-Fi signal, SSD free space — in the frame itself. The LCARS is instrumentation, not wallpaper.
Web panels
Chromeless site tiles with persistent logins — Claude, Google Messages — plus LCARS·TV, a YouTube tile with volume and playlist hotkeys, playing fan-made loops streamed from YouTube — swap in your own list any time.
Focus follows mouse
Point at a tile, it's focused. No click, no raise-flicker, and it politely stands down while menus are open or you're dragging.
Self-healing
A hung app never hangs the desk — every app gets its own actor thread. Drifted windows are guided back; stubborn ones get circuit-broken, not fought.
Config as text
One TOML file, hot-reloaded, with per-machine profiles: your 49″ desk and your 13″ Air each get fitting gaps and chrome from the same config.
Enterprise·D Views
A web panel Zil ships with rather than one you add: a Galaxy-class starship holding station at a starbase, drawn live in the tile. Not a game you play — a ship you keep half an eye on while you work. Open it from PANELS in the menu bar; ⌃⌥⌘W closes it like any other panel.
The pills along the top move the camera. AFT and AFT 2 look back across the saucer, FWD runs up the bow, NACELLE sits alongside the warp engines, and EXTERIOR pulls out to the whole ship. Beside them: mute, five volume steps, and VOX for the bridge crew. When the ship comes under attack the desk answers with it — the LCARS borders flush red, and stand down again when the shooting stops.
The crew only speak to a signed-in session. Sign in to Google inside the panel and the bridge starts talking; leave it signed out and you still get engines, weapons and music, just no voices. One thing to know going in: a panel is a WebKit view rather than Safari, so passkeys and saved-password autofill cannot reach it — verifying on another device is the way through. The session then lives in that panel's own store, so it is once, not every launch.
Two ways to fill a screen
Both layouts guarantee the same thing — every window gets a slice, and the slices add up to the whole screen. They disagree about whether every window deserves an equal shot at the middle. Open a few and watch.
Dwindle
Each new window halves its neighbour and takes the far side, cutting whichever way keeps tiles squarest. No decisions from you — but the window you care about shrinks every time.
Master-centre
Your real work holds the middle column and keeps it. Everything else alternates into two flanking stacks, and once those fill, new windows join the centre.
Flip the desk to 32:9 and dwindle's rule works against you — the boxes stay wide, so the cuts stay vertical and you get ever-thinner columns. That is why Zil opens any desk wider than 2.2:1 in master-centre, and why ⌃⌥⌘T exists.
LCARS on Omarchy
Zil is macOS only, and on Linux most of it would be dead weight: roughly two fifths of the code exists to fight the Mac — the Accessibility API, the layout tree, code signing — and Hyprland already tiles. So the console crossed over and the window manager did not. This is a quickshell bar plugin for Omarchy (Arch + Hyprland), not a port and not a window manager.
You get the swept elbow, the rail listing the windows on the current workspace with the focused one lit, the 1–9 strip, the NAV rosette, the ambient CPU and memory readout, and the filled band drawn beneath the windows so it shows through the tiling gaps. The seven ship palettes are generated from Zil’s own Swift at build time rather than copied, so the two can never drift apart, and it ships Antonio, the same display face, under the SIL Open Font License. LCARS·TV comes too, reading the same playlist and opening as a browser window Hyprland tiles like any other.
What it does not bring is Zil’s layout engine. Hyprland has dwindle and five master orientations of its own; the console drives those instead of reimplementing them. It changes the bar and the theme, not how your windows are tiled.
Console 0.2.0. The document surface crossed over: ZIL·DOC on Hyprland is the
same lcars-md viewer Zil ships, served from 127.0.0.1 instead of a private
zil:// scheme, with a small bridge standing in for the WebKit message handler. An
MCP server exposes the one tool that matters, show_document, so an agent on Omarchy
puts a plan or a diff beside your terminal exactly as it does on the Mac. Also in this cut: red
alert, the rail carrying both sections, LCARS·TV opening at Zil’s volume rather than
YouTube’s, and the palette ramp no longer sitting one theme behind.
The source lives in the Zil repo under omarchy/, with a README that records
what was kept, what was dropped, and why. Download it up top, beside the Mac build →
A screen your agents can use
An agent that has just written you a plan, a diff, or a table of results has nowhere good to put it. Terminal scrollback is a bad place to read a table and a worse place to read a diff, and opening a browser takes your keyboard away mid-task.
So Zil gives it a pane. show_document renders a file tiled beside the terminal
that asked — LCARS-styled, live-reloading as the file changes, and it never steals
focus. Your agent keeps working; you read at your own pace.
Plans and outcomes
Markdown with real headings, tables and syntax-highlighted code — plus diffs, JSON, CSV, source, images and PDFs. An lcars-chart block turns numbers into a bar, line, gauge or stat readout in the live palette.
Five tools, four read-only
show_document puts a file on screen. desk_status, desk_windows, desk_layout and desk_doctor let an agent see the desk it is drawing on — and none of them can move a window.
Wired up in one command
No config editing. Zil finds the agent clients on your Mac and registers itself with all of them, backing up each file first and refusing any it cannot parse.
zil agents install # Claude Code · Claude Desktop · Cursor · Windsurf · Gemini CLI
zil show report.md # or the show_document tool, from any MCP client
The pane is a hardened WebKit view served only from a private zil:// scheme:
no network, no file://, and script inside a document cannot run. An agent can show
you a document; it cannot use one to reach anything else. Every verb also speaks
--json, and the exit codes are API — 0 ok, 2 bad command,
3 not running, 4 refused — so a headless orchestrator can read the
result instead of scraping it.
Hotkeys
- ⌃ Control
- ⌥ Option (Alt)
- ⌘ Command
- ⇧ Shift
Every Zil shortcut starts with all three of the first ones held together — ⌃⌥⌘, one chord your other apps almost never claim. Adding ⇧ gives the same key its second meaning: ⌃⌥⌘J moves your focus to the next tile, ⌃⌥⌘⇧J moves the window there instead. If you would rather hold one key than three, Caps Lock can be remapped to send the whole chord.
| ⌃⌥⌘ T / R / G | toggle layout · retile · toggle gaps |
| ⌃⌥⌘ J / K | focus next / previous — ⇧ swaps instead |
| ⌃⌥⌘ 1–9 | go to workspace — ⇧ moves the window there |
| ⌃⌥⌘ ⇧S / ⇧R | quick-save / recall a tile profile |
| ⇧-click row, row | trade two tiles from the rail |
| ⇧-click row, 1–9 | move the window there and assign its app that workspace |
| click the layout pill | pick a desk shape — 2 | 1 1 | 2, 1 | 4r | 1 … |
| ⌃⌥⌘ ] / A | next ship theme · red alert |
| ⌃⌥⌘ Space | next wallpaper |
| ⌃⌥⌘ X / W | float ⇄ tile this app · close window |
| ⌃⌥⌘ V / P | LCARS·TV · web panels |
Every binding is also in the menu-bar console, grouped LCARS-style. A remappable Hyper key is on the roadmap.
Wallpapers
Five LCARS-era desktops. They live here, not in the app — downloading Zil stays about 3 MB whether you want these or not, and you take only the ones you like.
Zil already cycles a folder of them. Put them where it looks and it will pick them up:
mkdir -p ~/Pictures/Zil && cd ~/Pictures/Zil
curl -fsSLO "https://zil.daystra.com/wallpaper/{enterprise-d,enterprise-e,sensor-1,sensor-2,vortex}.jpg"
Then set the rotation in ~/.config/zil/zil.toml — manual changes only
when you ask (⌃⌥⌘B), or give it a number of seconds to cycle on its own:
[wallpaper]
dir = "~/Pictures/Zil"
cycle = "manual" # or cycle = "300" for every five minutes
Config
You probably never need this. The ZIL menu handles the day-to-day — theme, gaps, tile profiles, web panels, agent support, LCARS·TV, updates — and writes your choices back to the file itself. The file is here for the things a menu is bad at: per-machine profiles, and rules that pin an app to a workspace or float it on sight.
One file. Saving it reflows your desk in half a second; an invalid file is refused and the last good one stays live. Zil writes its own changes — theme, TV, exemptions — back into it, preserving your comments.
# ~/.config/zil/zil.toml [theme] name = "Daystrom" # Enterprise-D · Enterprise-E · Titan · Voyager [gaps] inner = 9 outer = 18 [[rule]] bundle = "com.apple.iCal" action = "workspace 3" [[profile]] # the 13-inch laptop gets tighter chrome match = { display_count = 1 } gaps = { inner = 5, outer = 10 } chrome = { side_rail_width = 118 }
Ship's log
zil doctor reports mouse_focus. And the desk can now be
arranged by intent: desk_arrange takes one plan — which apps go centre,
left, right, float or park — puts the desk back with desk_undo, and
reports every selector it could not match and every window it could not honour as data.
The arrange_for prompt carries the recipe for productivity, a meeting or
focus; the judgement is in the prompt an agent reads, Zil ranks nothing.2 | 1 1 | 2 is two stacked
left, two wide centre columns, two stacked right; 1 | 4r | 1 stacks four
centre rows. Pick one and the desk re‑deals, and the choice lands in
zil.toml. The deal knows what deserves the middle: focus windows —
terminals, editors, anything with a focus rule — fill the centre first;
ambient ones — chat, music, LCARS·TV, or an ambient rule —
fill the sides, and never take a third of the desk on arrival. Two new rail gestures:
⇧‑click one row, then another, and the two tiles trade places completely;
⇧‑click a row, then a number on the 1–9 strip, and the window moves there and
its app is assigned that workspace from now on. zil shape does the picking
from the shell.zil doctor, and names the window that
won a press it should have taken. A learned window minimum larger than 60 % of the
desk is refused as a transition rather than a constraint, and poisoned ones are discarded
on load — one had a side column widening to 2105 px every morning. New verbs:
zil centre pins a window into the middle column or releases it, and
zil swap trades two tiles' slots.zil.toml as [widgets], which hot‑reloads
the other way too. Underneath, three fixes to how a desk is dealt: a phantom slot that
could claim half the desk after a restart is gone; master‑centre's side columns now
widen to hold a window they used to shove into the centre; and workspace 1 is home —
if it ever stands empty while another workspace holds windows, they come to it. The
document pane keeps its ink readable on every palette: an accent too close to the ground
for text is lifted until it reads.zil.toml, it is always
there, and the Remove panel menu leaves it alone.insists on 2600×455, slot is 2600×433 — instead of
just reporting that something drifted.claude, not three copies of
2.1.247 — and anything the system will not let Zil inspect is left out rather
than shown as zero · uplink now sits above downlink on the Wi-Fi card, ▲ over ▼ ·
zil doctor reports per-core load and top memory, so an agent can read them
too.Earlier entries — 11 releases, 0.1.0 to 0.1.12
claude not on PATH" on Macs where
Claude Code was plainly installed, while the identical command from a terminal succeeded — a
GUI app launched by macOS inherits a minimal PATH, and the lookup trusted it. Zil now finds a
client's binary where it actually lives and, failing that, asks your login shell — the only
thing that really knows. Also: the manual-setup line for Antigravity pointed at a folder
instead of telling you to use its in-app MCP settings.zil agents install finds every
agent client on the Mac — Claude Code, Claude Desktop, Cursor, Windsurf, Gemini CLI — and
registers Zil's MCP server with all of them, so handing you a document is something an agent
can just do. No config editing: writes are backed up, atomic and idempotent, a config that
isn't valid JSON is refused rather than clobbered, and the clients that can't be rewritten
safely (Zed's JSONC settings, Antigravity's in-app config) get the exact snippet instead of a
guess. Also in the ZIL menu, and offered once on first launch · the MCP surface goes from
one tool to five: show_document plus read-only desk_status,
desk_windows, desk_layout, desk_doctor — an agent can
see the desk it's drawing on and cannot move a single window · the ZIL menu works again:
clicks on Zil's own dropdown were being swallowed by the same event tap that stops a click on
the console reaching the wallpaper, so picking a theme did nothing · the bar fits a
laptop — it needed 1884 pt and a 13-inch Air has 1470, so the readouts marched over the
app name; every pill now has a floor, surrenders its slack as the desk narrows, and the least
useful readouts stand down rather than overlap · LCARS·TV opens on a different episode each
time · the document pane wears a proper LCARS end-cap · and the calendar card says what
actually happened when access is refused instead of failing silently.rift's own records. A provider that isn't installed says so instead of showing
a zero, and Zil refuses to draw a progress bar against a limit nobody published — your
5-hour figure is scaled against your own typical session, and labelled as such.
zil ai returns the same data as JSON for agents.zil show report.md — or the
show_document MCP tool from any agent — renders a file in a pane tiled beside
the terminal that asked, without ever taking your keyboard. Markdown, diffs, JSON, CSV,
source, images and PDFs, live-reloading as the file changes · LCARS data readouts:
an lcars-chart block in any markdown file draws bar, line, gauge and stat
charts in the live palette · the renderer is
lcars-md, shared across the fleet ·
the pane can reach nothing but the document's own folder — no network, no
file://, and document script cannot run.zil panel).zil windows and fixed the same hour).zil doctor field report) · NAV rosette moves tiles directionally · stardate,
weather and calendar cards · CPU/SOC/fan thermals · per-window corner radii read from the
WindowServer · placement rules that learn app minimums · desk recovery across sleep, lock
and restarts · Sickbay + Picard themes · single-instance guard.Straight answers
zil.daystra.com for a
newer version (and downloads from there when you ask it to update); if you set a zip code it
asks Open-Meteo for the forecast; and the web panels and LCARS·TV you open are ordinary WebKit
views talking to those sites. One more is off unless you turn it on —
[ai] claude_live makes a single call to Anthropic's usage endpoint reusing the
token Claude Code already stored. Otherwise the AI figures are read from files on your
disk.A fan project
Zil is an independent, fan-made window manager, built out of affection for the look of the computer interfaces in Star Trek. It is not affiliated with, endorsed by, sponsored by, or approved by Paramount Global, CBS Studios, or any other rights holder.
Star Trek, LCARS, and related names and marks are trademarks of their respective owners, referred to here only to describe the design language this project pays tribute to. No claim of ownership is made over them, and no artwork, audio, or other material from the shows is redistributed with the app.
LCARS·TV plays fan-made ambience and loop videos that live on YouTube, published
there by the people who made them. Zil ships nothing but a list of video IDs and embeds
YouTube's own player — no video is bundled with the app, re-hosted, or downloaded, and playback
happens on YouTube's terms. Those videos belong to their creators, not to this project. Point it
at your own list any time from ~/.config/zil/zil.toml.
Zil is given away free and is not sold. The interface is an original implementation of that visual style, written from scratch.