Force

Every coding agent you run, in one terminal.

Force keeps your Claude Code and OpenCode sessions running on your machine or a server, through closed terminals and reboots, and tells you which one needs you, on your phone too.

curl -fsSL https://zalandemeter.github.io/install.sh | sh

Then type force. Linux, x86-64. No root, no packages, no config files.

                             │                                                                                                                        
 ───────   F O R C E ───────│ ─   ─ api ✻ claude · sonnet 4.6 · high · accept edits ────────────────────────────────   1 ─   1 ─ 󰪣  1 ─   ─   ─ 
                             ├────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ▍   shell               3h │                                                                                                                        
 ▍    shell ~                │● Update(server.py)                                                                                                     
 ▍   api                 1m │  └  Added 2 lines                                                                                                      
 ▍    idle                   │       9      def do_GET(self):                                                                                         
 ▍   billing-fix         1m │      10          if self.path == "/todos":                                                                             
 ▍    needs permission       │      11              self._send(200, TODOS)                                                                            
 ▍   docs-site           6m │      12 +        elif self.path == "/health":                                                                          
 ▍    your turn              │      13 +            self._send(200, {"ok": True})                                                                     
 ▍   infra              42m │      14          else:                                                                                                 
 ▍    idle                   │      15              self._send(404, {"error": "not found"})                                                           
 ▍ 󰪟  mobile              1m │      16                                                                                                                
 ▍    running a command      │                                                                                                                        
 ▍   migration-2024     30h │  Ran 1 shell command                                                                                                   
 ▍    stale                  │                                                                                                                        
                             │● I added GET /health to server.py. It returns {"ok": true} with a 200, and every other path still gets the 404.        
 ─   new ───   archived 0 ─│                                                                                                                        
                             │  I ran the server and checked three requests:                                                                          
                             │  - /health returned {"ok": true} with 200.                                                                             
                             │  - /todos still returned its list with 200.                                                                            
                             │  - /nope returned {"error": "not found"} with 404.                                                                     
                             │                                                                                                                        
                             │  The change is one elif in do_GET. I didn't commit it.                                                                 
                             │                                                                                                                        
                             │✻ Sautéed for 8s · done 12:10 PM                                                                                        
                             │                                                                                                                        
                             │❯ commit it with a short message                                                                                        
                             │                                                                                                                        
                             │  Ran 1 shell command                                                                                                   
                             │                                                                                                                        
                             │● Committed on master as 97b764d ("Add /health endpoint returning {"ok": true}"). The working tree is clean.            
                             │                                                                                                                        
                             │✻ Cogitated for 2s · done 12:15 PM                                                                                      
 ─────────  devbox ─────────│                                                                                                                        
   ✻ Claude                  │────────────────────────────────────────────────────────────────────────────────────────────────────────────────── api ─
   5h ━━━╸━━━━━━  34% 14:54  │❯ push it                                                                                                               
   wk ━━━━━━━━━━  18%   Mon  │────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
                             │  ▶▶ accept edits on (shift+tab to cycle)                                                                               

When the film ends, the window stays: click around in it.

Force itself, captured as text from running sessions.

You see who needs you.

A permission prompt or a question anywhere shows in the sidebar and as a count at the top. One click takes you there, and you answer it in place.

Close the terminal. It keeps working.

Sessions live in tmux on the machine, not in your terminal window. Drop the connection or restart the machine: every session comes back with its conversation, and one that crashes restarts by itself.

Your turn, on your phone too.

A session that finishes while you are elsewhere waits for you, marked your turn. Give Force one command and it runs it when a session needs you or finishes: ntfy, your own push server, a desktop notification.

Set up notifications

Every agent. Every machine.

Claude Code, OpenCode and plain shells in one list, with your Claude plan's five-hour and weekly limits under it. force host add puts a server's sessions one click away from your laptop's.

It names itself
Start a session without a name and Force names it after your first message. Claude Code sessions also open in the Claude app under their Force name.
Scripts and agents drive it
force prompt, wait and read hand work to a session and collect the answer. force skill is the guide an agent reads to run Force itself.
Nothing to set up
No root, no packages, no terminal profile. Force brings its own tmux and paints its own theme in any terminal or ssh login.

The commands you will use.

Everything else is in the menu, Ctrl+Space inside Force, and in the docs.

forceOpen the cockpit.
force new [NAME]Start a session in the current folder; without a name it is named after your first message.
force importList sessions Force doesn't manage yet; force import ID takes one over.
force host add NAMEAdd another machine you reach with ssh.
force prompt NAME TEXT --waitSend a session a prompt from a script or another agent and wait for its answer.
force status workingFrom a script in a shell session: show what it is doing on its card.
force settingsShow and change settings, such as the command that notifies you.
force updateInstall the newest release. Sessions keep running.
force uninstallRemove Force; your conversations stay.

Take a seat.

Force is the cockpit for every coding agent you run. One line installs it, no root needed.

curl -fsSL https://zalandemeter.github.io/install.sh | sh

Then type force. Everything else: the docs.