Repository navigation
Server server2-20261026-01
·
2 commits
to main
since this release
Official server release from quicktui-mono@d1853c9fc9e1cc796121cfb45a76b81b4dd4470e.
Server
Before you update
- Herdr 0.9.0 or newer is now required. With Herdr 0.8.x installed, the server does not use it and Herdr sessions are unavailable. The installer does not upgrade Herdr, so upgrade it yourself.
- Logging is now set with
log_level(info,debugorverbose; defaultinfo) anddebug_categoriesin the config file, or--log-level. Thedebugandverbosesettings and the--debugand--verboseoptions ofserveandservice installare removed. A config file that still sets them starts normally and logs a warning. quicktui-server authandconfig relay setare removed. Pair through QuickTUI Cloud with the pairing commands instead (see "QuickTUI Cloud, relay and pairing").- The retired
stableserver channel is removed. Devices paired with token-only credentials from very old app versions are removed and must pair again. - QuickTUI 1.8.x apps can no longer connect. Before, the server showed them an upgrade prompt; now it refuses them before sign-in. Update the app to connect.
- An explicit session backend list is now used as written, without fallback backends added. When no backend is configured, the server uses only the first available one in the order Herdr, tmux, Luvus (tmux is skipped on Windows).
- The server no longer deletes leftover AgentBridge V1 files when it starts (
quicktui.db*in the state directory,agent-bridge-*.json*in~/.quicktui/). If you update directly fromserver-20260809-09or an earlier stable release, you can delete them yourself.
QuickTUI Cloud, relay and pairing
- The server now uses the new QuickTUI Cloud (cloud.quicktui.ai / cloud.quicktui.cn). On its first start after the update, a server that used relay moves its relay registration to the new cloud and keeps its paired devices, so you do not pair again or turn relay back on. When your cloud plan's host limit is exceeded, the server stays registered but cannot use relay, and its relay status shows
host_suspended. - A server that still uses the retired relay setup stops retrying once the cloud refuses it and reports
legacy_relay_retired. Updated apps then ask you to turn relay on again. - Pairing through QuickTUI Cloud now asks you to approve the device on the computer. After you enter the code in the app, the computer shows a 6-digit code: press Enter if it matches the app, or
nto refuse. You choose the region (Global or CN) each time. - Relay can be turned on and off from the app. When the cloud pairing slots are used up, the server tells you to remove unused hosts in the app under QuickTUI Cloud > Relay Hosts.
- New
quicktui-server statusshows the relay connection and why relay is not working, for examplequota_exceededorhost_suspended. - Added pairing text, a copy-and-paste alternative to the QR code for when the camera cannot scan it. Choose "Pairing text" in
pairing welcome, or runquicktui-server pairing qrcode --text, and paste the line into the app. Like the QR code, it works once and expires in about 15 minutes. - The pairing QR code and pairing text now carry up to five addresses of the computer, in the order host name (not on Windows), Tailscale, WireGuard, LAN, public address, then tunnel, so the app can try the next one when the first fails. On Linux they also include stable IPv6 addresses (temporary IPv6 addresses are left out).
--public-url https://[IPv6 address]without a port now works.pairing qrcodeno longer stops with "multiple host IPs found", and the setup wizard andpairing welcomeno longer ask you to choose an address.--public-url, an explicit listen address or--select-addressstill put a single address in the code. - Fixed relay connections hanging on close or reconnect.
- Fixed a port-forwarding tunnel keeping its connection and connection slot after the client disconnected, when the client had already closed its sending side.
Notifications
- Notifications through relay now reach every iOS build: development, TestFlight and App Store builds of both QuickTUI and QuickTUI Next. Before, development builds and QuickTUI Next got none. This needs an updated relay; with an older relay, notifications to these builds are held back instead of sent to the wrong place.
- With relay, the iOS app icon badge shows how many Agent sessions wait for your approval or answer, and updates when you answer on another device. This needs an updated relay.
- Agent notifications now read "type · project · summary" in the language of each device's app, for example "Claude: Approval requested · quicktui-mono · Fix login race". The types are Approval requested, Input needed, Plan to review, Needs attention, several requests pending, Task complete, Error and Session ended. A session without a summary shows its workspace and branch instead of its ID. The separate session name setting is removed; the summary setting covers it.
- Several new requests at once arrive as one notification instead of only the first one.
- You now get a Task complete notification when a Codex turn finishes (not for turns you interrupt or that fail). With "Include summary" on, a Task complete notification shows the last paragraph of the agent's final reply instead of the session title, so you can see when the agent stopped to ask you something in plain text.
- You now get a notification when a Claude or Codex session waits for you but the request cannot be shown in the app, for example a Claude MCP input request. It opens the session. This needs an updated relay.
- The notification status in the app now says which push services the relay can deliver to (Apple, Google), or that this is unknown.
- Fixed the same approval request sometimes being notified twice.
Approvals and questions
- Approval cards now offer the agent's own "allow for this session" and "always allow" choices when the agent has them, and show what each choice allows: Codex (session approval, command prefix and network rules), Claude (its suggested permission rules), OpenCode 2 ("always" patterns) and Grok in leader mode. The agent applies the choice. pi and Cursor offer allow once and deny.
- Claude approvals from the app now go to Claude through its permission hook instead of key presses. When no hook is waiting, the server presses Yes or No only after it finds that dialog on screen.
- Claude plan confirmations (
ExitPlanMode) now come to the app with the plan text. Approve to leave plan mode, or reject with feedback to keep planning. - Claude questions with several parts, several selections or your own typed answer can now be answered from the chat. A Claude question now shows as waiting for your input instead of waiting for approval, and sending to the session works again right after you answer.
- Fixed Claude question cards that were greyed out, could not be selected, were missing after
/clear, were refused as outdated (also when the Claude view in the terminal was scrolled up), or picked the wrong option with Herdr. - Pressing Esc in Claude now ends the turn in the app too, instead of leaving the session shown as working or waiting.
- Codex approvals and questions can now be answered from the chat when Codex runs on its shared background server, which is the default when you start
codexyourself. Approvals show the command or the file changes as a diff, and say why when one can only be answered in the terminal. - Codex command approvals show the command Codex runs instead of its shell wrapper (
echo hi, not/usr/bin/zsh -lc 'echo hi'). Approvals to send input to a running terminal now say so, show the input, and do not offer "Always allow". - Codex approvals offer both deny and cancel when Codex allows it: deny refuses the request and Codex goes on with the turn, cancel also ends the turn.
- Codex MCP tool approvals and MCP server questions now show in the app with a notification. A question can be answered in the app when its form has only text fields or only choice fields. When a session has more than eight open MCP requests, the app says the rest wait in the terminal.
- Codex Plan mode questions can be answered from the chat, with an option or your own answer for each question. When Codex 0.163.0 or later finishes a plan and asks "Implement this plan?", the app shows the plan: approve to start implementing, or reject with feedback to keep planning. Then press Esc in the terminal, because choosing to implement there again implements the plan twice.
- Grok in leader mode (
grok --leader, oruse_leader = trueunder[cli]in~/.grok/config.toml) in a terminal opened from the app: answer questions, permission requests and plan approvals, and interrupt or stop the current turn from the chat, without typing into the terminal. Rejecting a Grok plan with feedback is not supported, because Grok drops the feedback. - Grok in default mode and Cursor: questions and permission requests can be answered from the app; the server checks the dialog on screen before it presses a key, and never picks a Grok "always" option. Questions with up to 15 options are supported.
- pi questions and permission requests are answered through pi's own dialog channel; editor and custom pi dialogs stay in the terminal.
- OpenCode 2 questions (single choice, multiple choice, several at once, typed answers) and permissions (allow once or deny) can be answered from the app, and a waiting question can be cancelled so the agent continues without it. Sessions started with
opencode --standaloneare still answered in the terminal. - Answers are no longer refused when the server briefly fails to check the agent process, and a refused answer can be sent again right away.
Chat
- Grok, pi and Cursor sessions can now receive messages from the chat. Sending also works for Agent sessions you started by hand and for sessions the server started before a restart.
- OpenCode 2: send messages to a running session and stop it from the app. A text that starts with
/goes to the model as text. Stopping also stops its background subagents and drops app messages it has not read yet; the session is not deleted. - Messages you send while the agent is working show as delivered and appear where the agent received them, instead of staying at the bottom of the chat.
- A Claude Code slash command you ran shows as your message, such as
/model opus, with its output as a collapsed system entry, instead of raw<command-name>and<local-command-stdout>tags. - A Claude Code Edit or Write approval that is waiting shows the change as a diff or the new file's content. A long change is cut short with a note to see the terminal.
- The chat now shows when a tool failed or was rejected, and by whom, for Claude, Codex, Cursor, Grok, OpenCode and pi.
- Context compaction of Claude, Codex, Grok, OpenCode and pi shows as one system entry, for example "Context compacted (auto, 204864 → 30626 tokens)". Grok no longer shows it as an unknown block. Empty thinking and reasoning blocks are no longer shown.
- Codex chats now show images, audio, skills and mentions in your messages, questions Codex asks while it keeps working, function call output, and subagent activity, review mode, hook prompts, dynamic tool calls, image generation and wait steps as readable text instead of raw JSON. A failed turn shows why it failed.
- Codex sessions you start or resume from the app with a reasoning effort now run on Codex's shared background server, so their approvals and questions can be answered from the app (unless you turned off Codex's
daemon_auto_start). For such sessions, messages, interrupt and stop stay in the terminal, and the app says why. - Fixed messages that appeared twice while a Codex turn ran, Codex taking a chat message as a new line instead of submitting it, Claude pasted text showing as a
pasted_contentblock, Claude Code 2.1.300 API request records (such as background task notices) showing as your messages, and injected context or system text showing as your own messages for Cursor, Grok, OpenCode, pi skill commands and Codex subagent prompts. - Fixed sending from the chat being refused after the first message when hooks were not installed or trusted, being turned off when the server had incomplete information about the session, and failing briefly with
ambiguous_matchat the end of a Claude turn. - Fixed older chat history not loading, losing messages or showing them out of order across pages for Claude, Codex, OpenCode, pi, omp and Grok. Long Codex, Cursor and pi chats load faster. Fixed OpenCode sessions outside the 500 most recent not loading, and Codex sessions not loading on Windows.
Agents and sessions
- Added omp (oh-my-pi) as its own agent type: its sessions, titles, models, history on the current branch, subagents and working state show in the app. Start or resume omp from the agent wizard with the Default, Ask or YOLO mode. On Linux, omp in a tmux or Herdr pane is linked to its pane, and from its chat you can send messages, interrupt, stop, and answer its questions, tool approvals, plan reviews (rejecting needs feedback) and select, confirm, input and editor dialogs. Restart omp once after the server updates its omp extension.
- OpenCode 2 sessions show again, with sessions moved over from OpenCode 1 listed once: history with tool calls, reasoning and compaction, and live status, tool activity, title, model and subagents.
- Rename an Agent session from the app: the title shows on every device, the tmux window or Herdr tab is renamed, and for Codex on the app-server the title also changes in Codex. Resume starts the agent again on its own session in a new tab of the workspace it last ran in, and recreates that workspace when it is gone. Luvus workspaces and sessions the server never bound cannot be resumed.
- A new workspace without a name is named after its working directory (
projfor~/src/proj,Home,Root), with-2,-3added for duplicates. An agent started from the app without a title is named after its start time, for examplechat-23-14:36. The tmux window or Herdr tab then follows the agent session's title within about 30 seconds, but never replaces a tab name you chose yourself. - The app shows the branch and worktree of Claude, OpenCode, Grok, pi and Cursor sessions. Sessions with no conversation yet are no longer listed for Claude, Codex, pi, Grok and OpenCode.
- Running sessions in the session list now show only the current tool name, without the changed-line count from
git diff. The count covered every uncommitted change in the folder, not only that session's. - Grok: session details show the model, tool results with an image show
[image], the session list shows the last message, and a turn that ends on an API error, such as a rate limit, shows the session as failed with the error type, and the session shows as running while Grok compacts the conversation. Fixed Grok sessions staying shown as running after an interrupt, a declined permission or a turn limit, subagent sessions listed on their own or under the wrong session, and hook events from current Grok releases being ignored. The server reinstalls its Grok hooks on its next start. - Codex: fixed sessions still showing as working after Codex crashed during a turn, turn-end hook events (
Stop,Interrupt) being dropped, and Codex asking you to trust hooks it already ran. A Codex session on the shared background server is no longer linked to the pane that started that server, so its notification no longer opens another Codex terminal. - Herdr: the server reports which agent runs in each pane, so the Switcher's Agents view shows each agent's icon. Opening a session's terminal from chat works after a server restart and right after the agent switches sessions in its pane (for example Claude's
/clear). The Chat button of a pane running pi now opens that pi chat. - New Claude, pi, Grok and OpenCode sessions show again when the server already tracks 5,000 sessions; the oldest sessions make room.
- Claude Code installed with its native Linux installer is now recognized in its terminal pane, so its chat can open the terminal. An agent that updates itself while running keeps its session link.
- Fixed Claude shown as not installed after Claude Code rewrote its
settings.json, Agent events lost after the hook queue filled up, an agent session lost after Ctrl+Z, and message previews in the session list turning off for 30 seconds after one slow refresh. - tmux sessions show the status programs report with OSC 7501, and Agent sessions use it when it clearly belongs to the agent.
- The server checks the fullscreen settings of Claude Code and Codex, and when a setting causes problems the app shows a hint to the FAQ, at most once a day. It never changes these settings.
- Opt-in Claude Desktop Code support on Windows and macOS (
[claude_desktop_code] enabled = true, then restart): view Desktop Code state and send text to an existing, connected, idle conversation without a terminal. It reads the Claude CLI login from~/.claude/.credentials.json. It is off by default because it calls undocumented Anthropic endpoints with your subscription login, which may violate Anthropic's Consumer Terms and put your account at risk.
Terminal
- Several devices can use one tmux session at the same time, each with its own view and input; window switches follow on all devices, and the size follows the device you used last. New
tmux_client_retention(default5m,0turns it off) keeps a disconnected device's tmux client so the same device picks it up again on reconnect. - The terminal no longer disconnects on a slow network: when output falls behind, the server sends a fresh screen, on tmux, Herdr and Luvus. Fixed switching terminals failing with "couldn't complete the switch" on a slow network.
- With updated apps, the terminal size changes only when you type, resize, or open or switch a terminal on a device, so a device that only watches or reconnects no longer resizes it for the others.
- With Herdr size locking, the phone takes back its size before a resize is confirmed, also when the keyboard opens or closes or you swipe to another tab.
- Text sent from the Input Bar now reaches the pane you see, also when an agent runs in it, keeps multiple lines, and goes to a pane scrolled back in tmux copy mode after leaving copy mode. With an updated app, the server confirms every send, so text that did not arrive comes back to the Input Bar instead of being lost, and a failed send no longer disconnects the app.
- Pane positions are now correct with a top tmux status bar (
status-position top), Herdr's tab bar, status rows and sidebar, and Luvus' header and sidebar, so pane zoom, taps and scrolling land in the right pane. - Luvus terminals now run a full
luvus attachclient. Fixed tab switching with Luvus 0.14 and paste markers in pasted text. - With tmux
mouse on, a tap in a pane no longer types text such as[<0;12;5Minto a program that does not use the mouse. Programs that use the mouse, such as vim or htop, still get the taps. - Fixed Herdr input going to the previous pane after a focus switch partly failed, tmux size locks applying to inactive and linked windows on tmux 3.3a, creating a tmux session right after deleting the last one on tmux 3.6, and a stale backend error when an older app on another device reset the terminal background.
Files and Git
- File favorites are now stored on the server (
file-favorites.json), so every device paired with the same server shares them. - The Git workspace can show a merge, rebase or other Git operation that is in progress.
- Fixed the files view returning an error for paths with a file in the middle, names that are too long or symbolic link loops (they now show as missing), and saving large files timing out or not stopping when cancelled.
Install, updates and maintenance
quicktui-server doctornow checks the whole installation: install, config, service, session backends, agent hooks, agent fullscreen settings, pairing, relay, and the AgentBridge runtime inside the running server. It shows one line per area and writes details to a log.doctor --fixshows the repairs it can make, such as restarting the service or repairing agent hooks, and applies them after you confirm (--yeswithout a terminal). For problems only you can fix, it shows numbered steps with the commands.- Automatic updates are now on by default: the server checks every hour, first 10 minutes after it starts, and installs the update and restarts once no app has been connected for one minute. Turn this off from the app or with
auto_update = false(QUICKTUI_AUTO_UPDATE). Microsoft Store installs still update from the Store. The app can now show the installed version and offer a restart when an update waits. An update check you start from the app finishes even when the app disconnects. quicktui-servercommands now show messages in English or Simplified Chinese. Interactive pairing commands ask for the language first;--ui-langskips the question, andconfig set --cli-langorQUICKTUI_CLI_LANGsaves a default.- On Linux hosts without systemd, installation and
service installset up a built-in supervisor that restarts the server after a crash (service start,status,restart,upgradeandconfig setwork with it). Installing as a normal user on CentOS 7 and RHEL 7 now uses it too, instead of stopping withFailed to get D-Bus connection. - On macOS, the background service shows as
quicktui-serverinstead ofshin Login Items. - Windows: fixed AgentBridge2 failing to open its own databases with "invalid uri authority". Fixed the notification area menu items Pair New Device, Paired Devices, Check for Updates and Run Diagnostics, whose window closed at once or showed nothing. Fixed AgentBridge2 refusing its own files under "Run as administrator" and failing to read its connection file while the daemon runs. Claude settings files that are symbolic links are now handled as on macOS and Linux.
- Apps that connect while the server stops now get the normal "server shutting down" message instead of a broken connection.
Performance
- Much lower CPU and disk use while idle with many or long Claude sessions: the server reads a Claude transcript again only when it changes, then reads only the new part, and checks Claude session folders with far fewer file system calls.
- The session list costs much less: last-message previews are reused while a transcript is unchanged (Windows: Claude only),
git diffno longer runs for every running session, and the session cache stops rewriting itself at its 5,000-session limit. Codex and Grok session details are written, and change notices sent, only when they change. - Background checks do less repeated work: push notifications read only changed sessions, sessions without a conversation or with missing files are not reread every few seconds, Codex and OpenCode history is no longer read every second while unchanged, and each agent pane report reads the process table once.
Security
- Auto-update now ignores an
update_manifest_urlorreleasesconfig value that is not an official QuickTUI source (quicktui.ai,dl.quicktui.cn,github.com/dualface/quicktui) or a loopback address, uses the default source, and logs one warning naming the setting. Servers installed through the official install scripts are not affected. - A repository's own git configuration can no longer run programs when the files view or the Git workspace reads status, diffs or blame.
- Connections that have not signed in yet are now limited much more strictly, also through relay, so others cannot use up a host's connections.
Install with:
curl -fsSL https://quicktui.ai/q.sh | sh -s -- install --channel server2
This command resolves the server from the live server2 channel in server-manifest.json; it is not a tag-pinned historical install.
Assets use these names:
quicktui-server-<platform>-<arch>
quicktui-server-windows-<arch>.exe
quicktui-server-<platform>-<arch>.sha256
quicktui-server-<platform>-<arch>.gz
quicktui-server-<platform>-<arch>.gz.sha256
Installer assets are not included in this server release. q.sh and installer assets are published independently from server2 releases.