A native Mac terminal for your own servers, written in Rust with GPUI. Servers sit in folders, commands and their output are blocks, and an AI agent inside the app can service a server through the same shell, on a local LLM.
I built it for myself and put the source here in case it helps someone. Deep alpha, not a product: there is nothing to download. You take the code and change it.
The pictures show made-up data. The same app runs in your browser, on a made-up shell: type help.
Maybe, if:
- you look after a lot of servers and want them in one list, not in a config file and your memory;
- you run a model on your own machine and want it to look at a server for you, with nothing installed on that server;
- you want your own terminal and would rather change working code than start from zero.
Probably not, if:
- you want an app to install and just use;
- you need accounts, a cloud, team features or Windows and Linux: none of that is here;
- you want your passwords encrypted on disk. Here they are in plain text in one SQLite file, on purpose.
I work on a lot of servers. I wanted to pick one from a list and be on it, with no project set up for each, and I wanted to type commands in a real text field with a mouse and a selection, not at the end of a line of a 1970s screen.
The idea of commands as blocks comes from Warp, whose client is open source. I liked it, but I needed only about that much of it, so I had my own written. I say "had" because an agent did it: I am a front-end developer and I don't write Rust.
The other half is the agent. Servicing a server is mostly looking around: the logs, the disk, a service that fell over. A local model can do that well enough, as long as you see each command and decide what may change.
- Servers in folders. Drag them where they belong. Address, login, password or key, a jump host. One SQLite file you can open and read. Import from
~/.ssh/config. - Blocks. Each command is a card with its output, its folder, how long it ran and how it ended. A failed one is red. A click selects it, a double click brings the command back to the field. ⌘-click opens a link, or goes to a folder
lslisted. vim and htop still get the whole screen. - A real command field. The shell only ever gets the finished command. ↑ walks this server's own history, Tab completes from it, and a file dropped from Finder becomes its path. Nothing is installed on the server.
- An agent, on your model. Any endpoint in the OpenAI chat format. Its commands go down the tab's own shell, each a card you can read, and anything not known to only read asks you first. Built on Rig, in the same process: no Node, no service. It has limits you set for context and steps, skills you write as plain folders, and any MCP server over HTTP. Near the context limit it retells its older work to itself instead of forgetting it, a long output waits in a file to be read on, and it keeps a plan you can see.
- Sessions that come back. Your tabs return at the next start with their commands and the agent's conversation, on a new shell. A tab you close waits in History.
- An MCP server.
term --mcpgives your other agents the list of servers. - Logins through ssh's own askpass. Nothing reads the terminal's output to answer a prompt, so a password never answers stray text.
![]() |
![]() |
![]() |
![]() |
The tests pass and every screen has been looked at in pictures, but this is young. The agent has run for real on a local model on this Mac. Logging in to real servers with a password has barely been used yet, and a conversation is gone once its tab closes.
The code is the point. Give the repository to your coding agent and describe what you need. Everything is written down for it: AGENTS.md, skills, and a SPEC.md beside each module. It is laid out for a small local model: short files, folders named for what they are, a map from a request to a file.
The look is the one all my apps share, plain macOS on purpose. It has no character of its own, so it makes a good blank to build on.
Every app I make also compiles to the browser, from the same Rust. I am a web developer, and I like seeing how far that goes. Only what cannot exist in a tab is made up: the shell, the servers and the agent. The grid, the blocks and everything you click are the app's own code.
MIT. Other people's code in it is listed in Cargo.lock; vendor/ holds the few crates patched in one or two lines, each with its own licence, and the icons are Lucide (licence).




