Force

Force documentation

How to install Force, find your way around the cockpit, and drive sessions from a script or another agent. Everything here is something Force does today.

Install

One line, as your user. No root, no packages. Linux on x86-64; it needs only curl or wget.

curl -fsSL https://useforce.cc/install.sh | sh

It unpacks into ~/.local/share/force and brings its own tmux 3.4 (and its own Python 3.12 when the system one is older than 3.11). It puts force in ~/.local/bin and on your PATH for bash, zsh and fish, starts its two background services (systemd user units; without systemd, force starts them itself) and, on a desktop, installs the icon font.

Options go after sh -s --:

$ curl -fsSL https://useforce.cc/install.sh | sh -s -- --no-fonts
--no-fontsDon't install the icon font.
--no-servicesDon't create or start the background services; force still works.

Force doesn't install the agents. For Claude Code:

$ curl -fsSL https://claude.ai/install.sh | bash

First run

$ force                 # on the computer you sit at
$ ssh -t devbox force   # or on a server, over ssh

force opens with a shell session. + new at the bottom of the sidebar starts an agent session (Claude Code or OpenCode) or another shell. Any terminal works: Force paints its own theme, so there's no profile to set up. In an agent, Alt+Enter or Ctrl+J starts a new line.

A short intro plays when you attach; any key skips it. force --no-intro skips it once, force settings set intro false for good.

The cockpit

The sidebar on the left lists every session on the machine, the agent you picked fills the rest, and a header above it shows the session's name, agent, model, effort and permission mode. Sessions you aren't looking at that need you or have finished show as counts at the top right.

States

Each session's bar and icon in the sidebar show its state. It comes from the agent itself (its status files and API), not from reading the screen.

needs youA permission prompt, a question or a plan approval is waiting.
workingThe agent is running.
your turnFinished since you last looked at it.
idleFinished, already seen.
staleIdle for more than 12 hours (staleAfterHours).
downThe agent process isn't running; restart it from the menu (x).
outdatedRuns an older agent version; upgraded by itself once idle for 10 minutes and off screen.

Plan limits

While Claude Code sessions run, the bottom of the sidebar shows your plan's five-hour and weekly windows with their reset times, amber from 70% and red from 90%. The numbers come from Claude Code's status line and update with every reply in any Force session.

Keys and the menu

Ctrl+Space opens the Force menu with every action and its letter: press the letter or click the item, Esc closes it. Ctrl+\ and the ? controls button in the header open the same menu. There is no prefix key, so the agent never gets your keys by mistake.

jJump to a session: type part of its name, Enter jumps.
TabBack to the session you were in before.
hSwitch host: this machine or another one (also a click on the host name).
nNew session: agent or shell, name, folder.
tNew shell on this host, in the sidebar like a session.
rRename it (tmux, agent and Remote Control name; applied when idle).
fMove it to another folder, keeping the conversation and memory.
K JMove it up or down in the sidebar.
xRestart it, same conversation.
uUpgrade it to the newest agent version now.
a AArchive it; open the archive (Enter restores, d deletes).
dDelete it for good (asks first).
eRestart all sessions, busy ones once idle; for example after changing ~/.claude/settings.json.
bHide or show the sidebar.
HHealth check (force doctor --fix).
qQuit this terminal. Sessions keep running.

Without the menu

Alt+PgUp Alt+PgDnPrevious and next session, in every terminal.
Alt+1…9Session 1 to 9 (Tilix and Terminator keep these for their own panes).
ClickA sidebar row switches to it; + new and archived open their dialogs.

To copy, drag to select and right-click: it goes to the clipboard of the computer you sit at, in any terminal and over ssh. The mouse wheel scrolls.

Sessions

Each session runs in tmux on the machine, not in your terminal window. Close the terminal, lose the connection or reboot: it comes back with its conversation, and one that crashes is restarted (up to three times in ten minutes).

$ force new                          # named after your first message
$ force new api --cwd ~/src/api      # or name it yourself
$ force new logs --kind shell
$ force rename api api-v2
$ force move api-v2 ~/src/api-v2     # another folder, same conversation
$ force archive api-v2               # stop and hide; force unarchive brings it back
$ force delete api-v2 --yes          # for good; the agent's own transcript stays

Claude Code sessions also appear in the Claude app under their Force name (Remote Control), so the name is the same in Force, in Claude and on your phone.

Bringing in sessions you already have

force import lists the Claude Code sessions Force doesn't manage yet: running ones in any terminal and older stopped ones. force import ID (or a prefix of six or more characters) takes one over with its conversation: a running one once it is idle, a stopped one resumed in its folder.

Other machines

Add a server you reach with ssh (key login), and its sessions are one click away from your laptop's. Force installs itself there if it's missing.

$ force host add devbox                 # ssh target defaults to the name
$ force host add gpu me@10.0.0.7
$ force host list
$ force host upgrade devbox
$ force host remove gpu

Switch with the host name at the bottom of the sidebar, h in the menu, or force --remote devbox. A host that can't be reached shows as offline and reconnects by itself. Session commands act on the host the terminal is showing.

Notifications

Give Force one command and it runs it when a session needs you, finishes or stops. It runs through sh -c, so anything works: ntfy, your own push server, a desktop notification.

$ force settings set notifyCommand \
    'curl -d "$FORCE_MESSAGE" ntfy.sh/my-force'
$ force settings set notifyCommand 'notify-send Force "$FORCE_MESSAGE"'
$ force notify-test needs-you         # or finished, down

The command gets these variables:

FORCE_MESSAGEA ready-made line: the session's name and what happened, like api: finished.
FORCE_EVENTneeds-you, finished or down.
FORCE_SESSIONThe session's name.
FORCE_KINDclaude, opencode or shell.
FORCE_HOSTThe machine it runs on.
FORCE_STATEIts state now.
FORCE_VIEWED1 if you were looking at it, else 0.

Scripts and agents

Anything that runs a shell can drive Force: a script, a cron job or another agent. Use these instead of tmux send-keys: they find the right pane and never type into an open approval dialog.

See what is running

$ force list --json        # every session: name, state, kind, folder, model, limits…
$ force explain api        # why it shows its state, and its last screen rows
$ force read api --lines 120

States in scripts: needs-you, working, your-turn, idle, stale, starting, down, shell.

Hand a session work

$ force prompt api "add a /health endpoint" --wait --timeout 600
$ git diff | force prompt api -        # "-" reads the prompt from stdin
$ force wait api --until your-turn
$ force keys api enter                 # answer a dialog: enter esc tab up down …
$ force keys api --literal 2

prompt refuses a session that needs you: read its screen and answer with force keys first. A timeout doesn't prove nothing was sent, so force read before you retry.

Report from a script in a shell session

$ force status working --summary "building the image"
$ force status needs-you --summary "approve the deploy?"
$ force status your-turn               # holds until someone looks
$ force status idle

Without a report, a shell session shows working while a program runs and your turn when it ends.

Let an agent run Force

force skill prints a short guide written for agents. Point Claude Code or OpenCode at it and it can start sessions, hand them work and collect the answers.

Settings

Settings live in ~/.config/force/settings.json, which holds only what you change.

$ force settings                       # --all includes the advanced ones, --json
$ force settings set animations subtle
$ force settings unset animations
$ force settings edit
KeyDefaultWhat it does
notifyCommandoffRuns when a session needs you, finishes or stops (above).
animationsfullfull, subtle (no shimmer on working sessions) or off.
introtrueThe intro when you attach.
iconsautoauto, on or off.
sidebarWidth29In columns.
staleAfterHours12When an idle session turns stale.
autoUpgradeSessionstrueUpgrade outdated agents by themselves…
autoUpgradeIdleMinutes10…once idle this long and off screen.
layoutsplitsplit or classic.
opencodeManagedfalseKeep Force's own copy of OpenCode on the latest release.
checkForUpdatestrueThe daily check for a new Force.

Updates and uninstall

A daily check shows a new release in the sidebar footer. force update installs it (--check only looks); your sessions keep running.

force uninstall asks first (--yes answers for you). It keeps your conversations, the session list and your settings; --purge removes everything, the icon font included.

When something is off

$ force doctor --fix            # health check, repairs what it can
$ force explain NAME            # why a session shows the state it does
$ force restart NAME            # same conversation; --all for every session
$ journalctl --user -u force -f # the background service's log
~/.config/force/Your settings and hosts.
~/.local/share/force/Force itself, the session list, and copies of archived conversations (Claude Code deletes its transcripts after 30 days).
~/.local/state/force/Runtime state.

Command reference

force                                  open the cockpit   --remote NAME, --no-intro
force new [NAME] [--cwd DIR] [--kind claude|opencode|shell]
force rename OLD NEW
force move NAME up|down|DIR
force restart [NAME|--all]            force upgrade [NAME|--all]
force archive NAME                    force unarchive NAME
force delete NAME [--yes]             force list [--all] [--json]
force import [ID] [--name NAME] [--dry-run]
force host add NAME [SSH] | list | remove NAME | upgrade NAME
force prompt NAME TEXT… [--wait] [--until STATE] [--timeout SEC] [--json]
force wait NAME [--until STATE] [--timeout SEC]
force read NAME [--lines N]           force keys NAME KEY…
force status STATE [--summary TEXT]   force explain NAME
force settings [set KEY VALUE | unset KEY | path | edit] [--all] [--json]
force notify-test [needs-you|finished|down]
force update [--check]                force uninstall [--purge] [--yes]
force doctor [--fix]                  force fonts
force skill                            the guide for agents that drive Force