Skip to content
@@

How to use Claude Code outside the terminal

· Xinyao

Claude Code is the best coding agent I have used, and like every CLI agent it has one built-in limitation: it lives in a terminal, and most of your work does not.

Every time you want it to see something — an error dialog, a UI you are describing, a paragraph someone sent you in Slack — the loop looks the same. Screenshot. Save to disk. Switch to the terminal. Drag the file in. Type a prompt. Wait. Copy the answer. Switch back. Paste. It works. It is also a dozen context switches for one question.

This post is about a different shape: leaving Claude Code exactly where it is — your CLI, your subscription, your config — and bringing its input and output to wherever you happen to be working.

A bridge, not a wrapper

The obvious fix is to wrap Claude Code in a GUI: sessions in a sidebar, chat history, a message box. That recreates the problem in reverse. Now you live in the wrapper, and the wrapper has to guess at everything the TUI already does well — approval prompts, streaming output, the agent's own idea of what a session is.

So @@ is not a GUI for Claude Code, and it is worth saying that plainly before you download it. It is a bridge: it grabs what you are looking at, hands it to the claude binary as an ordinary subprocess, and puts the answer back where your cursor already was. The agent's own interface stays the agent's own interface.

That distinction decides everything else in this post.

Type @@ in any text field

In any macOS input — Slack, Notes, a browser textarea, a commit message — type @@. A small composer opens at your cursor, and a snapshot of your screen is already attached in a tile you can remove. The @@ you typed is taken back out of your text.

From there, anything you can see can become context:

  • A screenshot⌘⇧4 for an area, ⌘⇧5 for All-In-One, including scrolling capture and OCR, each with an Ask @@ action (Screen Capture)
  • Selected text — highlight in any app and a compact bar appears next to the selection (Selection Actions)
  • Clipboard history⌘⇧V opens a searchable shelf; any entry becomes context with ⌘Return (Clipboard History)
  • Files — select them in Finder and type @@, or drag them onto the Orb

Add one sentence — make this reply friendlier, explain this stack trace, turn this screenshot into a markdown table — and press Return. The answer comes back in a preview card at your cursor. Press Tab and it is inserted into the field you were typing in. Not quite right? Press R, add one more sentence, and the new result replaces the old one. No app switch happened at any point. The full behaviour is in the manual, under the @@ trigger.

What actually runs

Nothing exotic. A quick answer is a one-shot run of the CLI you already have, from a command template you can read and edit in Settings → Agent:

claude --safe-mode -p --output-format text {prompt}

{prompt} is passed as a single argument — never spliced into a shell string, so quotes and newlines survive intact. The run is deliberately conservative: read-only tools, no session persistence, and it executes in @@'s own scratch workspace rather than whatever folder you happen to be standing in. @@ resolves claude through your login shell environment, including nvm, mise, Homebrew, and the rest, so the bare command you type in Terminal is the bare command that works here.

Swapping to Codex, Grok, Cursor, Pi, Hermes, or OpenCode is a dropdown, and any CLI that takes a prompt can be added as a custom provider. @@ ships no model and no account of its own; whatever you run, it runs under your own login. See Agents for the whole picture.

When the job should change something, hand it back

Some requests are not "answer me", they are "do it": organise this folder, batch-rename these files, fix this repo. For those, a preview card is the wrong output. The right output is Claude Code running interactively, in your terminal, with its own approval flow.

So that is literally what happens. Press ⌘Return instead of Return and @@ opens a real session in your terminal — Terminal, iTerm2, Ghostty, Warp, WezTerm, kitty, or Alacritty — with your context loaded and the working directory set: the Finder folder you triggered from, if there was one, and @@'s scratch workspace if there was not. If you would rather hand off to Claude, ChatGPT, or Cursor as a desktop app, that is the same keystroke with a different destination.

Then @@ gets out of the way completely. No process tracking, no output parsing, no task centre. The terminal you already trust is the interface, which is the same reason a GUI wrapper was the wrong idea in the first place. Handoff covers the details.

Permissions and privacy, honestly

Anything that can watch your screen and your keystrokes deserves scrutiny, so here is the short version.

The keyboard listener is observe-only, and its detection buffer holds the last two characters — nothing you type before or after the trigger is collected. Password fields are never read: when macOS marks input as secure, @@ does not look at keystrokes at all, checked on every keystroke and never cached. Selected text lives only inside the action you invoked; it is never stored or logged. Anything a password manager marks as concealed never enters clipboard history, and history stays in @@'s own folder on your Mac.

Your prompts never pass through our servers — they go from @@ straight to the CLI on your Mac, and where they go from there is between you and Anthropic. The app itself makes four kinds of network request: licence check, update check, wallpaper download, and anonymous usage counts. Few enough to watch them all go by in Little Snitch. Every permission is optional; deny one and the feature it unlocks stays dormant while the rest of the app keeps working.

Try it

@@ works with Claude Code, Codex, Grok, Cursor, and other CLI agents — it drives whichever you already have. It is a native Mac app, 13 MB, no Electron, with a 7-day free trial that needs no account and no card: download it for macOS.

If you take one idea from this post, take the shape. The agent stays in the terminal; the context and the answer travel to you. It is a small inversion, and it removes a dozen switches from every question you ask. There is more on why we built it that way in Introducing @@.

All posts