Kelvin AmoabaandBrennan Benson 13d94acd45 feat(browser): add an eraser to screenshot markup (#24801)
* feat(browser): add an eraser to screenshot markup

Click or drag across marks to remove them whole, one undo step per drag.

Fixes #23258

* fix(browser): drop the in-flight markup gesture on undo and redo

Undo mid-erase left marks hidden against the restored drawing, so release removed them and cleared redo.

* fix(browser): settle a markup gesture whose release was lost

A gesture now blocks any new press so a second finger cannot steer it.
If its own release never arrived, that block also swallowed the next
press from the same pointer, so the next drag continued the stale
gesture: a stroke jumped from its old end, and an erase swept from the
old point, removing marks along a line the user never touched.

A pointer cannot press twice without releasing, so a press from the
gesture's own pointer now settles the old gesture as its release would
have, then starts the new one.

* fix(browser): an eraser click takes only the top mark, a drag takes all

A click on overlapping marks now erases only the one drawn last, matching
what a user expects from pointing at a mark. Once the pointer really moves
the press becomes a drag, whose first sweep starts at the press point, so
every mark under it and along the path is erased. A move that reports the
press point again does not turn a click into a drag.

* fix(browser): undo mid-gesture takes back only the gesture

Undo pressed while a stroke or an erase is still held now drops just that
gesture, as the newest step; the committed marks are untouched, so the next
Undo takes back the last of them. Redo and Clear drop the gesture, then apply
as before. With the gesture gone, the rest of that drag neither draws nor
erases until the next press. Undo is enabled while a gesture is in flight,
since it now has something to take back.

* fix(browser): keep an eraser tap a click within a 4px slop

A touch or pen tap often reports a move a fraction of a pixel from the
press point. The eraser treated any move to a different point as a
drag, so such a tap erased every mark under the finger instead of only
the top one. The erase gesture now records its press point and a
pressed/dragging phase: it stays a click until the pointer travels 4 CSS
px, then sweeps from the press point as a drag.

* fix(browser): undo over an empty erase undoes the last mark

Pressing Undo while an eraser was held over empty space only dropped
the erase, which had hidden nothing, so Undo looked dead and the Undo
button was enabled for a step with no visible effect. Undo now treats
a held gesture as a step only when releasing it would change the
markup (a stroke being drawn, or an erase that hides at least one
mark). Otherwise Undo takes back the last committed mark and ends the
erase; with nothing to undo it leaves the erase alone. The Undo button
is enabled exactly when pressing it would change something.

* fix(browser): redo with nothing to redo keeps a held markup gesture

The Redo button is disabled when there is nothing to redo, but the
Cmd/Ctrl+Shift+Z shortcut is not. Pressed while a stroke or erase was
held down, it replaced the document with itself and dropped the
gesture, so the stroke or erase silently stopped. Redo now leaves the
state untouched when there is nothing to redo. Clear still always
drops the gesture.

* fix(browser): discard a markup gesture whose pointer was cancelled

pointercancel was wired to the release handler, so when the system took
a touch or pen pointer away mid-gesture (an OS gesture or palm
rejection), the stroke was saved and an erase was applied as if the
user had lifted deliberately. pointercancel now discards the in-flight
gesture owned by that pointer: the stroke is not saved and the marks an
erase was hiding come back, with no undo step. Lost pointer capture and
a press that reveals a missed release still commit, since both stand in
for a release that did happen.

* test(browser): pin that losing the pointer commits a markup gesture

The canvas commits a stroke or erase when it loses pointer capture
without a release, so a gesture can never be left open. No test covered
that wiring: removing it, or routing it to the cancel handler, left every
test green. The new test ends a stroke with only the lost capture and
checks that Undo then leaves it to redo, which only a committed stroke
does.

* fix(browser): do not save a markup shape pressed without dragging

A Rectangle, Ellipse or Arrow press released without dragging paints
nothing, but it was saved as a zero-size mark. With the eraser, a click
takes only the topmost mark, so that invisible mark made the next eraser
click on a visible mark at the same spot appear to do nothing. It also
added an undo step with no visible effect, and while such a press was
held Undo was enabled but only dropped the invisible shape.

A shape with no size is now not saved, and a held unmoved shape press
is not something Undo takes back. Pen and Highlighter taps still save
the dot they draw; text is unchanged.

* test(browser): drop a cancelled-stroke test the overlay test already covers

MarkupOverlay.test.tsx drives the same press, move, pointercancel and
following lost capture through the real canvas wiring and asserts Undo
stays disabled, which already proves nothing was committed or held.

* docs(browser): note the erase drag re-rasterizes the markup layer

The committed layer now renders the visible marks, so an erase drag
re-rasterizes it once per newly hit mark; the comment said never.

---------

Co-authored-by: Brennan Benson <79079362+brennanb2025@users.noreply.github.com>
2026-10-05 16:41:08 -07:00
2026-09-26 20:50:46 +00:00
2026-05-04 20:42:03 -07:00
2026-03-16 22:27:51 -07:00
2026-03-28 10:19:14 -07:00

Orca Orca

GitHub stars Total downloads across all releases License: MIT Join the Orca Discord Follow Orca on X Supported platforms: macOS, Windows, and Linux

中文 · 日本語 · 한국어 · Español · Français · Português

The AI Orchestrator for 100x builders.
Run Codex, ClaudeCode, OpenCode or Pi side-by-side — each in its own worktree, tracked in one place.

Download Orca

Orca desktop app running agents in parallel worktrees, with the Orca mobile companion app in the corner

Features

Mobile Companion

Monitor and steer your agents from your phone — get notified when an agent finishes and send follow-ups from anywhere.

iOS App Store · Android APK 0.0.52 · Docs →

Orca desktop with the mobile companion app

Parallel Worktrees

Fan one prompt across five agents, each in its own isolated git worktree — compare the results and merge the winner.

Docs →

Parallel worktree orchestration

Terminal Splits

Ghostty-class terminals with WebGL rendering, infinite splits, and scrollback that survives restarts.

Docs →

Terminal splits

Design Mode

Click any UI element in a real Chromium window to send its HTML, CSS, and a cropped screenshot straight into your agent's prompt.

Docs →

Embedded browser and Design Mode

GitHub & Linear, Native

Browse PRs, issues, and project boards in-app — open a worktree from any task and review without a context switch.

Docs →

GitHub and Linear task workflows in Orca

SSH Worktrees

Run agents on a beefy remote box with full file editing, git, and terminals — auto-reconnect and port forwarding included.

Docs →

Remote worktrees over SSH

Annotate AI Diffs

Drop comments on any diff line and ship them back to the agent — review, edit, and commit without leaving Orca.

Docs →

Annotate AI-generated diffs

Drag Files to Agents

VS Code's editor with autosave everywhere — drag files or images straight into an agent prompt.

Docs →

Drag files and images into an agent prompt

Orca CLI

Agents drive Orca too — script every workflow with orca worktree create, snapshot, click, and fill.

Docs →

Script Orca from the CLI

Also in the box:

  • Quick open — Search across worktrees, files, agents, commands, and repo context without leaving your flow.
  • Account switcher & usage tracking — See Claude and Codex usage and rate-limit resets, and hot-swap accounts without re-logging in.
  • Rich repo previews — Preview Markdown, images, PDFs, and repo docs in the workspace.
  • Computer Use — Let agents operate desktop apps and visible UI when a workflow needs real interaction.
  • Notifications and unread state — Know when an agent finishes or needs attention, then mark threads unread to come back later.
  • And many, many more — we ship daily, so this list is perpetually behind. The changelog is the real feature list.

Supported Agents

Works with any CLI agent — if it runs in a terminal, it runs in Orca.

Claude Code logo Claude Code   Codex logo Codex   Grok logo Grok   Cursor logo Cursor   GitHub Copilot logo GitHub Copilot   Muse logo Muse   DeepSeek Harness logo DeepSeek Harness   ZCode logo ZCode   OpenCode logo OpenCode   MiMo Code logo MiMo Code   Amp logo Amp   OpenClaude logo OpenClaude   Antigravity logo Antigravity   Pi logo Pi   oh-my-pi logo oh-my-pi   Hermes Agent logo Hermes Agent   Devin logo Devin   Goose logo Goose   Auggie logo Auggie   Autohand Code logo Autohand Code   Charm logo Charm   Cline logo Cline   CodeBuddy logo CodeBuddy   Codebuff logo Codebuff   Freebuff logo Freebuff   Command Code logo Command Code   Continue logo Continue   Droid logo Droid   Kilocode logo Kilocode   Kimi logo Kimi   Kiro logo Kiro   Mistral Vibe logo Mistral Vibe   Qwen Code logo Qwen Code   Rovo Dev logo Rovo Dev   + any CLI agent


Install

Desktop — macOS, Windows, Linux

Or via a package manager:

# macOS (Homebrew)
brew install --cask stablyai/orca/orca

# Arch Linux (AUR) — or stably-orca-git to build from source
yay -S stably-orca-bin

Mobile Companion — iOS, Android

Pair with your desktop app to monitor and steer your agents from your phone.


Community & Support

  • Discord: Join the community on Discord.

  • Twitter / X: Follow @orca_build for updates and announcements.

  • WeChat: Scan to join the Orca community WeChat group 11.

    WeChat group 11 QR code for the Orca community
  • Feedback & Ideas: We ship fast. Missing something? Request a new feature.

  • Privacy: See the privacy & telemetry docs for what anonymous usage data Orca collects and how to opt out.

  • Show Support: Star this repo to follow along with our daily ships.


Developing

Want to contribute or run locally? See our CONTRIBUTING.md guide.

The relay that pairs the mobile app with a desktop host is also in this repository under cloud/, with a separate pnpm workspace and setup guide.

Orca contributors

GitHub star history chart for stablyai/orca

Signed Builds

Windows code signing sponored/provided by SignPath.io, certificate by SignPath Foundation.

License

Orca is free and open source under the MIT License.

S
Description
Orca is the ADE for working with a fleet of parallel agents. Run any coding agent with your own subscription. Available on desktop, mobile and remote runtime.
Readme MIT
1.8 GiB
Languages
TypeScript 95.3%
JavaScript 4%
Swift 0.2%
HCL 0.1%
CSS 0.1%