Web client
rove --web serves Rove in a browser. It runs the same bridge the iOS and
Android apps pair with (IOS.md), and the page is one more client of
it: same daemon, same tasks, same terminal sessions as the TUI.
rove --web # 127.0.0.1:7878 only
rove --web --port 7900 # another portIt prints two links and keeps running until you stop it:
open: http://127.0.0.1:7878/#token=…
pair: ws://127.0.0.1:7878/?token=…Open the first in a browser. The second is the phone pairing URL. A phone
already paired with rove-bridge keeps working: the two share one token.
What it does today
- The Tasks rail: projects, tasks and their tabs, with the TUI's status marks
(
?waiting on you,!needs you,●unseen turn,○quiet, a spinner while working) and the+N/−N/↑N/ PR marks. - Click a task or tab to open its terminal session, and type into it. That includes answering an engine's prompts.
- Right-click a project, task or tab for the same menu the TUI has: new conversation, close tab, rename, rename branch, pin, set status, change engine, copy the task ID, branch or path, land, delete.
+ New taskat the bottom of the rail, and+in the tab strip for a new conversation. The first message is optional, as in the TUI's picker: without one you get a plain engine (or shell) tab. A fork to new tasks needs one.- The Inbox: click
INBOX nat the top of the rail.↑↓moves, Enter opens the session and clears it,dclears it without opening.
The keyboard works as in the TUI: the rail's own keys (j/k, Enter, n,
/, r, d and the rest of the sidebar chords), the ctrl+a prefix layer
with its guide, F1 help and the command palette, and the direct chords such as
Ctrl+E, Ctrl+1..9, F2–F5 and F7. Your ~/.rove/settings/keybindings.yaml
applies here too. Chords the browser keeps for itself never reach the page:
close a tab with ctrl+a w or the menu instead of Ctrl+W, open one with + or
Ctrl+E instead of Ctrl+T, and there is no Ctrl+Q (a page cannot quit itself).
web/PARITY.md lists every TUI action and whether the web has it yet.
Security
- It listens on
127.0.0.1only unless you pick a bridge preset (--preset tailscaleor--preset cf, see IOS.md). There is no flag that opens it to the whole network by default. - The token rides in the link's
#fragment, which browsers never send to a server, so it reaches no access log. The page stores it in the browser's local storage and removes it from the address bar. - The page sends the token as a
Sec-WebSocket-Protocolvalue, because a browser cannot set theAuthorizationheader phones use. A socket opened from another site is refused even with the token. --rotate-tokenrevokes every browser and phone at once.
The page's files are served without the token (they carry none); every
operation needs it. With --preset cf, Cloudflare Access gates the page too.
Limits
- The standalone
rovebinary does not include the page;rove --websays so. The npm package does. - A browser tab resizes the shared session to its own width, as the phone apps do, so the TUI may redraw at the browser's size while it is open.