Your computer-use agents are generating screenshots faster than you can name them. Cowork captures every step of a checkout flow. Claude in Chrome dumps a frame on each navigation. Codex pastes terminal screens when debugging. Meanwhile, your desktop accumulates Screenshot 2026-05-16 at 2.43.22 PM.png.
Rosie is a scheduled housekeeping job that looks at each screenshot — pixels, OCR, surrounding context — and gives it a name that tells you what's actually in it. Then files it. Then indexes it. Forever.
The longer it runs, the more your screenshot folder becomes a searchable visual knowledge base of what your agents — and you — actually did.
- 🤖 CUA-aware — first-class watchers for Cowork, Codex, Claude in Chrome, Operator, Manus, Devin, Replit Agent, Cursor, Goose, Open Interpreter, Browser Use, and any custom app built on the Computer Use SDK.
- 🧠 Intelligent naming — local vision model (gemma3, qwen2-vl, moondream) reads the image, OCR reads the text, and a context-fusion layer reads sibling files, window titles, and calendar events to produce a name that's actually useful.
- 📂 Closed-vocab intent taxonomy — every screenshot is tagged
error,output,evidence,reference,doc,ui,meme, orother. Makes the archive queryable instead of just searchable. - 🔒 Local-first — Apple Vision OCR is native and free. Local VLM runs via Ollama. Hosted fallback is opt-in. Your screenshots never leave your machine unless you say so.
- 🗂️ Sidecar source of truth — each curated image gets a JSON sidecar with caption, tags, OCR text, agent run ID, and provenance. SQLite is a denormalized read cache, rebuildable from sidecars.
- ⏱️ launchd-scheduled — fires every 15 minutes, idempotent, safe to crash. Restarts pick up where they left off.
- 🔌 Pluggable sync — push high-signal captures to Obsidian, Notion, Logseq, or wherever your second brain lives. One adapter file per destination.
- 🛡️ Sensitive-capture quarantine — OCR pre-pass detects credentials, OTPs, and card numbers and routes them to an encrypted directory, never indexed in plain SQLite.
A six-stage pipeline, each stage a pure function with logged input/output. Idempotent end-to-end. Crash anywhere and the next run picks up cleanly.
For the full methodology — naming schema, intent taxonomy, context enrichment, sidecar schema, launchd configuration, module layout — see SPEC.md.
Status: MVP under build. Phase 0–4 land first (see roadmap). Star the repo to follow.
# Clone
git clone https://github.com/your-username/rosie.git
cd rosie
# Install (Python 3.11+)
pip install -r requirements.txt
# Set up Ollama (for local VLM)
brew install ollama
ollama pull gemma3:4b
# Configure
cp config.example.yaml config.yaml
$EDITOR config.yaml # set archive_root and pick your sources
# Dry-run first
python curate.py --config config.yaml --dry-run
# Install the launchd job (runs every 15 min)
./install.sh
After that, leave it alone. Check ~/Pictures/Archive/ in a few days.
Sources are declared in YAML. One entry per agent, one entry per manual capture surface:
archive_root: ~/Pictures/Archive
sources:
- name: cowork
paths: [~/Library/Application Support/Cowork/screenshots]
sidecar_hints: [task.md, transcript.json]
- name: claude-chrome
paths: [~/Library/Application Support/Claude/chrome-screenshots]
- name: codex
paths: [~/.codex/sessions/*/screenshots]
- name: manual
paths: [~/Desktop, ~/Pictures/Screenshots]
include_only: ["Screenshot*.png"]
vlm:
primary: ollama:gemma3:4b
fallback: none # or claude-haiku / gpt-4o-mini
ocr:
engine: apple-vision
enrichment:
calendar: true
sibling_files: true
shell_history: false # opt-in
Full schema in config.example.yaml.
A few principles, in case you want to argue with them:
Closed-vocab beats free-form. The eight-intent taxonomy is the wedge that turns a search engine into a filing system. You can't ask "show me all the agent errors from May" against a pile of free-form captions. You can against intent=error.
Context fusion beats bigger models. A 4B local vision model + sibling-file context produces better names than a frontier model staring at pixels alone. The agent already wrote what it was doing in task.md next door — read it.
Local-first or it's not yours. A visual knowledge base of everything your agents did is only useful if it's also private. Hosted API calls are optional and opt-in.
The sidecar is the source of truth. Indexes get corrupted; SQLite gets out of date; embedding models change. JSON sidecars next to the files outlive all of that. Rebuild any index from sidecars in one pass.
Spec-first, code-second. Rosie has a spec. PRs that change behavior open a discussion against the spec before they change the code.
- Spec locked
- Phase 0 — Discover + triage + timestamp rename
- Phase 1 — OCR + VLM + sidecar + archive
- Phase 2 — Context fusion (sibling, window title, calendar)
- Phase 3 — SQLite index + CLI search
- Phase 4 — launchd install + log hygiene
- Phase 5 — Knowledge-base sync adapters (Obsidian, Notion, Logseq)
- Phase 6 — Embedding search + weekly digest
- Phase 7 — MCP server (expose archive to other agents)
- Phase 8 — Linux support
Issues and PRs welcome. Read SPEC.md first — Rosie is spec-led, so most discussions start there.
If you want to add a new source (a new CUA tool, a new manual capture app), it's a one-entry change to the watch registry plus optional sidecar hints. Open a PR with the entry and an example screenshot you'd like curated.
MIT. Use it, fork it, ship a SaaS version, doesn't matter.