Agent Float. A small work hub for macOS.

Keep work moving.
Keep attention in one place.

See which agent is working and which session needs your answer. Continue from one small floating panel.

Explore the features · Installation

A local macOS 26+ app. These examples use fictional sessions and simulated replies.

● 2 ASK🔵 1🟢 1 NEW
Improve the checkout screen
Claude sample-app · Awaiting answer · 2m
Add session detection
Codex agent-float · Awaiting answer · 1m
Handle API responses
Codex agent-float · Running · 7m
Extend regression coverage
Claude sample-app · Done · 3m

01 / See

Orange, blue, and green dots show waiting, running, and completed turns.

02 / Go

Click a locatable session to reach its terminal.

03 / Reply

Answer supported questions directly in the panel.

Only when you need it.

From checking status
to continuing the conversation.

Select an example. This interactive document never connects to real sessions or sends terminal input.

Fictional data · No actual navigation or delivery

Orange · Awaiting You

A question or approval needs a response. ASK clears when the actual wait resolves.

Blue · Running

Work is active or expected to resume through a Claude scheduled wakeup, loop, or background job.

Green · Done / Idle

The turn ended and can accept further input. This does not guarantee the work succeeded.

Gray means an unknown state, suspected inactivity, or failed observation of a previously known Codex session.

NEW clears when you click its session, manually select the tab in Ghostty/Terminal.app/iTerm2, or work resumes. Expanding the list alone does not clear it. Manual Orca tab and tmux pane changes are not detected.

Claude and Codex.
Know who is working, and where.

The name badge identifies the agent. The adjacent app icon identifies its terminal. Both appear on the second row, preserving title space and the meaning of status colors. Agent type does not split the status groups.

Names You Can Read

Agent identity remains clear without depending on color.

Consistent Status

Waiting, running, and done dots keep their existing meanings.

The Same Name in Replies

Panel replacement, inline expansion, and side cards all show which agent you are answering.

English list with Claude and Codex badges
Native SwiftUI examples. The list is 280px wide; reply views are 320px wide. Glass adapts to its actual background.

Say “sent”
after checking the record.

The panel stops if the question changes, the terminal screen becomes unreadable, or the recorded reply differs. Progress and failure guidance stay visible.

Four Verification Gates

  1. Confirm the same question is waiting.
  2. Read the terminal screen.
  3. Send one input and verify its screen change.
  4. Compare the recorded answer.

A mismatch or verification timeout is never shown as success.

Preserve Existing Text

Do not mix a reply into an existing terminal draft. Ghostty tests with one character and erases that character if a draft was found.

Approval Stays in the Terminal

Approval details are read-only. The panel does not approve on your behalf.

Single-choice reply and simulated result
Choose an answer and verify delivery.
Review multiple answers
Review all answers and edit an individual question before sending.
Reply to a question in the final message
Read the last message and write a reply.
Read-only approval guidance
Inspect approval details, then use the terminal.

Drafts survive returning to the list and reopening the same waiting question. They are discarded when the app exits, the question changes, or the session stops waiting. Expand a long last message with Show All.

If nothing was sent, the result explains why. Recheck returns to editing and reassesses the same question. Open Settings helps recover Accessibility access. Existing terminal replies or ended sessions update the result; untouched results may return automatically to the list. A delivery that sent keys stays visible until acknowledged.

Interrupted input or mismatched records leave FAIL and Needs attention. Close the failure view, open the terminal, or Command-click the session to clear it.

An existing draft blocks sending
A mismatched answer leaves a failure

Make room for your workflow.

Reply View

Switch Panel (default) replaces the list. Expand in Row grows the selected row in place. Side Card opens beside the list, aligned with the row.

Edge Contrast

Outline (default) adds a contrasting boundary. Inverse of Background paints a contrasting surface. Plain Glass leaves the system glass tone unchanged.

Icon Location

Menu Bar (default), Dock, or Both. The Dock icon also appears in Command-Tab. Hiding the menu bar icon preserves settings in the Dock context menu.

Language

The menu is always titled Language, with 한국어 then English. Switch immediately. Until you choose, the first macOS language selects Korean for ko and English otherwise. Manual choices persist.

Position and Displays

Drag the summary row. Position persists, is clamped after display changes, and can be reset with Reset Position. The pill appears across Spaces and fullscreen apps; long lists scroll.

Focus and Motion

Hovering the inactive list does not steal keyboard input. Replies accept keys only while open and return focus on close. Reduce Motion follows macOS settings.

Inline reply placement
Side-card reply placement

Launch at Login registers the current app location and may require System Settings approval. Register the installed app so cleaning build outputs does not remove it. Quit Agent Float from its menu; the Dock supplies its own Quit action.

Clear boundaries.
Predictable behavior.

CapabilityClaude CodeCodex
DiscoveryLive process and session file; automation can appear without a terminalLocal shared app-server plus a live TUI and uniquely matched terminal
Dialog repliesSingle/multiple choice, custom input, multiple questionsSingle choice, notes, multiple questions
Text repliesSupported in compatible terminalsSupported in compatible terminals
ApprovalRead-onlyRead-only

Terminal Navigation

TerminalDestinationReplies
GhosttyTab matched by title/cwdVisible selected unsplit tab only
OrcaTerminal selected through CLISupported
Herdr desktop appVerified local terminal through herdr-appRead-only
Terminal.app / iTerm2Tab matched by ttyRead-only
tmuxPane, then outer app; tty tab selection in Terminal.app/iTerm2Supported, including Orca team tmux
Other terminalsOwning app only (Claude fallback)Read-only

Without an attached tmux client, attach in a new Ghostty tab. Claude background jobs open a Ghostty tab running claude attach <jobId>. Rows without locators have no navigation highlight/click. Failed navigation beeps; NEW clears only after the destination really becomes frontmost within one second.

Input limits: one line, up to 800 UTF-16 units. Leading /, !, or #, embedded @, and control characters must be handled in the terminal. Ghostty hidden/other-Space/split tabs are read-only. Orca suggestions can look like drafts and block sending.

Codex 0.165.0 discovery requires the local shared server; --no-daemon, separate/remote servers, and unrelated IDE/desktop sessions are excluded. Duplicate/renamed titles may prevent discovery. Screen recognition follows measured Claude 2.1.309 and Codex 0.165.0 layouts; changed layouts stop input rather than guessing.

Question rules inspect each sentence independently of interface language. Korean and English requests are supported. Recognized optional offers and closing remarks count as done. Ambiguous conditions can still be false positives.

System-rendered context menus follow macOS language. Window managers may snap the pill, and Space transitions can slide it temporarily. See the README limitations for details.

Start locally.

Requires macOS 26+ and Swift 6 (Xcode 26 or Command Line Tools). Orca navigation requires /usr/local/bin/orca. Codex discovery requires its local shared app-server.

git clone https://github.com/Enjoywater/agent-float.git
cd agent-float
scripts/create-signing-identity.sh
make install

Install elsewhere with make install INSTALL_DIR=~/Applications. A local-only signing certificate preserves Accessibility and Automation grants between rebuilds; without it, ad-hoc signatures may require renewed approval.

Navigation requests Automation permission per terminal. Ghostty replies also require Accessibility to verify the screen. Restore access in System Settings → Privacy & Security, or use Open Settings from a read-only reply.

Keyboard Shortcuts

Develop with make test, make bundle, and make run. Normal tests never type into real sessions. Dated design records remain in Korean.

A few useful answers.

Why do I see a session I did not launch?

Claude automation may create live session files. Temporary titles can appear when no conversation title exists. There is no automatic manual/automated filter; terminal absence alone is not proof.

Why is a Codex session missing?

It must use the local shared server and uniquely match a live TUI, Codex home, cwd, and terminal title. Closed or ambiguous sessions are excluded.

Why is a reply read-only?

The terminal may be unsupported, hidden, split, or ambiguous, or Accessibility access may be missing. Previews and approvals stay in the terminal.

Does this website control my agents?

No. Theme switching, command copying, and the reply demo operate only inside this document. All native recordings use fictional sessions and simulated results.

Does Done mean the task succeeded?

No. It means the agent's turn ended and can accept input. Review the work before relying on its outcome.