Open source Apache-2.0, zero dependencies ›

The fastest way to give
Claude Code context

Attach the active window or webpage to your next Claude Code prompt. Press both Option keys and stillpane captures a screenshot plus its full text as markdown.

Download for macOS
macOS 14 or later
Claude installs the app for you
Works with Claude Code Terminal VS Code JetBrains

Press both Option keys

Try it right here, on this page.

claude — ~/dev
~/dev
⌥ capture attached stillpane.dev · shot.png + text.md

                  
The full page text, pulled from the live DOM as markdown
the whole page, read from the live DOM
> what is this page?
● Read shot.png, text.md (0 lines)
● stillpane.dev's landing page. I have your screenshot and all 0 lines of the page text. What do you want to do with it?

What you get

01

Two ways to capture

Both Option keys take the picture and the text.

Hold Shift and you get the text alone, which costs fewer tokens.

02

The full page, as markdown

Sends your agent formatted markdown, keeps headings, links and tables, and includes everything scrolled out of view.

03Coming soon

Send it to a remote agent

Capture on your Mac, attach it to a Claude Code session running on your own server.

this Macnow
your VPSsoon
any ssh hostsoon
04

Any window

Native apps, browsers, Electron apps like Notion and Slack, a stack trace, an error dialog. If it is on screen, it can go.

05

No account, no telemetry

Nothing to sign into and nothing reported back. Captures are written to a folder on your Mac, pruned after 24 hours, and never sent to us.

06

Free and open source

Apache-2.0, one Swift binary, zero third-party dependencies. Read every line that touches your screen.

How it works

the gesture

⌥ left + ⌥ right

screenshot + full text as markdown

⇧ shift + ⌥⌥

text only, no screenshot taken

● Captured “Technical SEO in 2026” — Safari

● All 14 sections, including the 11 scrolled out of view

● Not OCR, so nothing was guessed at

A webpage can contain text that looks like an instruction to Claude. So the block marks everything a capture carries as untrusted, and contains no captured text of its own, not even the window title. There is nothing on screen anyone could write that would make Claude treat it as coming from you.

Why I built it

I alternate between Codex and Claude Code, and the one Codex feature I kept missing on the Claude side is Appshots. It only works in the Codex desktop app, not the CLI, and Anthropic marked the equivalent Claude Code request "not planned". That was enough of an excuse to build it.

I had wanted to put something open source into the world for years and never had the right project for it. This one was small enough to actually finish, and annoying enough to be worth finishing.

I was only trying to get the feature working in Claude Code. It came out a little different. The capture goes exactly where I want it every time, and that makes a world of difference in how I work.

It is all on GitHub. Take it apart.

Yanis @SahebYanis

Questions

Why not just paste the URL?

Pressing a hotkey is way faster than selecting a URL and copying it. Claude also gets more out of it.

Pasting a URL asks Claude to go and get the page. It fetches it as a stranger: logged out, cookie wall, paywall, or an app that renders nothing until you sign in. That is a tool call and a wait, and what comes back is often not the page on your screen.

A capture skips all of it. The page you are actually looking at, as clean markdown, already attached. It also works on Mac apps. Slack, Notion, a terminal, an error dialog. None of those have a URL to paste.

What about browser use?

Slow and expensive. Driving a browser is a loop of navigate, screenshot, read, decide, repeat, and every screenshot in that loop costs tokens. A capture is one keypress and one payload, and you were already looking at the right page.

Is this Appshots for Claude Code?

Same concept - Codex got there first. Same screenshot, same text pulled through the macOS accessibility APIs, same content you never scrolled to.

What is different is that you choose where the capture goes.

Say you have not touched Codex in an hour. You are reading something, you capture it, and it opens a brand new thread. So you go and find the conversation you actually wanted, come back, find your place on the page again, and capture a second time. That is most of my captures, and it is far more irritating than it sounds.

A capture here waits for your next message, in whatever session you send it from. You pick the destination by picking where you type. There is no wrong thread to climb back out of.

Codex also gives you no way to grab just the text. With stillpane you hold Shift along with the two Option keys, and you get the markdown without the screenshot, which saves tokens on anything long.

Codex can also only take a capture from its desktop app. stillpane works on every Claude Code surface: the CLI, the desktop app, VS Code, etc. And it is open source, so you can check all of this yourself.

Why not an MCP server?

An MCP server charges rent. Its tool schema rides along in every prompt of every session, costing tokens whether you capture that day or not, and each actual capture still costs a round trip: Claude decides to call the tool, calls it, waits, reads the result, all to deliver something that was in front of you the whole time. A hook stays out of the prompt entirely and costs nothing until the moment a capture attaches. No schema, no call, no wait. You press two keys and it is already there.

Why is a Mac app needed?

Half of it is a plugin. The hook that attaches a capture to your next message lives inside Claude Code. The other half cannot: a skill runs when Claude calls it, and a capture happens earlier, while you are reading the other window.

Catching that moment takes a real Mac app, with the permissions macOS requires to read another app's window. That is the menu bar app.

Does my screen content get uploaded?

stillpane operates no server and reports nothing about you or your usage. A capture is written to a folder on your Mac and deleted after 24 hours.

When you attach one to a message, Claude Code sends it to your configured model provider as part of that conversation, the same as anything you type, and that provider's retention policy applies from there.

Where does it not work?

Text quality tracks what the app exposes. Native apps and browsers are rich. Electron apps like Notion and Slack work in full, though the first capture after one launches takes a couple of seconds while its text is built. Canvas-drawn interfaces such as games and some design tools fall back to the screenshot alone, which is the same limit Codex hits.

Two hard limits beyond that: it needs macOS 14 or later, and captures land in Claude Code running on your Mac, so a session in the cloud cannot see them.