Fully local AI assistant that watches your screen to eliminate the context problem. No cloud. No data leakage.
16
stars
178
commits
Python
primary language
Sep 11, 2026
updated
A fully local AI assistant that watches your work to build context automatically without needing to explain much to an LLM. 100% private - no cloud, no data leakage.
Clippy Vision is a desktop AI companion that passively observes your work - active windows, clipboard, typing patterns, and screenshots - and builds a continuously updating memory of everything you do. When you open the chat, it already knows your context. No copy-pasting. No re-explaining.
Everything runs entirely on your machine. No API keys, no cloud, no data leaving your device.
Your work is not stored in one place. It is spread across the browser, your IDE, local PDFs, terminal output, chat apps, notes files, spreadsheets, and design tools. Each of those keeps its own partial record, or none at all, and none of them know about each other.
Clippy watches all of them and keeps one timeline. Two things follow from that, and neither is possible from any single app's own history:
2103.00020v1.pdf, a Jira ticket referred to only by its ID, a config you edited in a nameless scratch buffer. Clippy read the content, so the words that were actually in front of you are what you search.Claude and ChatGPT are built for reasoning, writing, and general knowledge. They are excellent when you bring them context. They are not built to know what was on your screen yesterday without you telling them.
Clippy Vision is built for the context problem. It watches your work, remembers it, and answers from that memory. It does not replace Claude or ChatGPT. It fills the gap they cannot: your personal activity history.
| Per-app history (browser, recent files) | Claude / ChatGPT | Clippy Vision | |
|---|---|---|---|
| Sees | Names and timestamps, one app at a time | Whatever you paste or upload | Screen content across every app |
| Answers with | A list to scan | Its general knowledge | What you were actually doing |
| Needs you to reconstruct context | Yes | Yes | No - already saw it |
| Runs where | Local | Cloud | 100% on your machine |
| Best for | "Which tab or file did I open?" | "Help me solve / write / explain this" | "What was I doing / reading / debugging?" |
Use Clippy when you need your own work history back. Use Claude or ChatGPT when you need a strong reasoning partner. Many people use both: Clippy to reconstruct context, then paste that into Claude to go deeper.
One question. Answer pulled from papers, chat tools, and a local notes file from the same research stretch.
Same kind of personal question. Clippy answers from activity it saw on your machine. Claude has no record of that work, because it never saw it.
Click your platform to download v1.2.2 directly:
All releases & older versions
·
The installer includes a setup wizard that handles Python, Ollama, and all required models automatically. No terminal required.
Clippy Vision is under active development. Three releases shipped in the first two weeks, including full macOS support, and bug reports usually get a reply the same day.
Trying Clippy? Share feedback (5 min) to help shape what we build next.
Clippy Vision runs a local text model for chat and uses accessibility APIs plus OCR for screen capture (no vision model in the capture path).
| Minimum | Recommended | |
|---|---|---|
| OS | Windows 10 / 11 (64-bit) | Windows 11 |
| System RAM | 8 GB | 16 GB |
| GPU VRAM | Not required (integrated OK) | 4 GB+ dedicated |
| Free disk | 8 GB | 10 GB+ |
qwen3:8b, ~4.7 GB).git clone https://github.com/protocorn/clippy-vision.git
cd clippy-vision\electron-ui
npm install
npm start
The app will open the setup wizard on first launch and walk you through dependencies.
Clippy is reactive today: you ask, it answers. The next bet is making it proactive, so it can act on what it sees instead of waiting to be asked. Capture now reads window text through accessibility APIs and falls back to local OCR without loading a vision model. A timeline view remains another priority so you can see and delete exactly what was captured.
No dates attached to any of it. PROJECT_VISION.md has the current thinking, the priority order, and an honest list of what does not work yet. If you want to shape any of it, the open issues are the place to start.
| Layer | Technology |
|---|---|
| Desktop UI | Electron |
| Backend | Python / FastAPI / Uvicorn |
| Local LLM runtime | Ollama |
| Main reasoning model | qwen3:8b |
| Screenshot text | Accessibility APIs + RapidOCR fallback |
| Embedding model | Bundled all-MiniLM-L6-v2 (event RAG is opt-in) |
| Query classifier | Fine-tuned MiniLM-L3 |
| Database | SQLite (WAL mode) |
| Screen capture | mss, pywin32, pynput |
core/screen_capture.py runs as a background process and captures:
core/screenshot_scheduler.py)Every captured event passes through a three-tier classification pipeline before being stored:
Tier 0 - Rule-based (deterministic, instant) Fast rules that immediately flag obvious signals: too few keystrokes → not interesting; known background system process → not interesting; typing deviation from personal baseline → interesting (score 9).
Tier 1 - Feature-based (scoring) Scoring starts at 5. Multiple features add or subtract: typing deviation, context novelty (how many times this app was seen in 7 days), typing intensity z-score, clipboard content length. Events below 4 are dropped; above 7 are kept; 4-7 go to Tier 2.
Tier 2 - LLM fallback
The last 3 events + current event are sent to qwen3:8b for context-aware classification. Output is INTERESTING or NOT_INTERESTING; classification never queues a vision model.
Screen text enrichment
Each captured frame records bounded text from the foreground accessibility/UI API. RapidOCR runs only when that text is empty or too sparse. A background processor (core/screenshot_processor.py) groups visually identical screenshots using perceptual hashing and stores the resulting text with the nearest event (±10 s); if none exists, it creates a screenshot_analysis event. Image embeddings and event-level RAG are disabled by default.
A background summarizer runs every 5 minutes and groups recent interesting events into session summaries using qwen3:8b. It runs in two passes per tick:
Runs every 5 sessions and extracts high-level behavioral facts from summaries. Each fact is:
Conflicting facts are preserved in memory_conflicts and surfaced to the agent for user resolution. User-provided corrections via save_identity automatically close related conflicts.
A fine-tuned MiniLM-L3 classifier (agent/router.py) maps every incoming query to one of:
| Category | What it covers |
|---|---|
time_anchored | "What was I doing yesterday at 3 PM?" |
topic_search | "What did I work on related to Clippy?" |
specific_recall | "What URL was I reading this morning?" |
memory_query | Questions about facts Clippy has memorized |
casual | General chat, no retrieval needed |
Each category has a dedicated prefetch module. Context is retrieved in parallel before the LLM is called, so the agent already has relevant data in its prompt without needing to make tool calls reactively.
A ReAct agent (agent/react_agent.py) with function calling. Tools available:
| Tool | Description |
|---|---|
search_sessions | SQL queries against the sessions/summaries table |
search_events | SQL queries against the raw events table |
recall_memory | Lists all memory cluster labels |
fetch_cluster | Fetches facts from a specific cluster |
save_identity | Saves autobiographical details |
save_note | Saves explicit things the user wants remembered |
Prompt components: conversation history (last 8 turns + rolling summaries), user profile, top-8 memory facts by semantic similarity, and prefetched context from the router.
All data lives in a local SQLite database (core/data/events.db):
| Table | Contents | Retention |
|---|---|---|
events | Raw captured events | 7 days |
sessions | Summaries of events | 90 days |
memory_clusters | Cluster metadata | Permanent |
memory_facts | Individual long-term facts | Permanent |
memory_conflicts | Unresolved fact contradictions | Permanent |
memory_meta | Settings and distiller state | Permanent |
conversations | Full conversation history | Permanent |
user_profile | User name | Permanent |
FTS5 virtual tables on events and sessions enable full-text search across all stored content.
127.0.0.1 on a port chosen at launch, so it is never reachable from your network.The one outbound request: Clippy Vision checks the public GitHub releases page for a newer version, at most once every 12 hours. It sends no chat, screen, profile, or account data — only the request itself, like opening the releases page in a browser. Turn it off any time under Settings → Updates.
# Python dependencies
pip install -r requirements.txt
# Run the desktop app
cd electron-ui
npm install
npm start
# Build the Windows installer
npm run dist
The built installer appears at electron-ui/dist/ClippyVision-Windows-Setup-{version}.exe (or ClippyVision-macOS-{arch}-{version}.dmg when building on macOS).
MIT - see LICENSE for details.
Every feature in Clippy Vision has a person behind it. This wall is how we say thank you - by name, with what they actually built, backed by real numbers from git history.
| Contributor | What they built | Commits | Lines | |
|---|---|---|---|---|
| @protocorn 💻 📖 🎨 🤔 🚧 | Designed the core app: agent, vision pipeline, memory system, and the Electron desktop shell. | 89 | +93,446 / −3,132 | |
| @rusetiq 💻 📦 | Brought Clippy Vision to macOS: native screen capture, permissions, and Apple Silicon + Intel packaging. | 8 | +39,032 / −3,226 | |
| @ABarpanda 💻 | See their commits → | 4 | +278 / −217 | |
| @vitorparras 💻 | See their commits → | 1 | +188 / −0 | |
| @vaishn4vi 💻 | See their commits → | 2 | +120 / −41 | |
| @adity982 💻 | See their commits → | 2 | +98 / −18 | |
| @Draoui-Haroun 💻 | See their commits → | 2 | +68 / −7 | |
| @shaurya703 💻 | See their commits → | 1 | +49 / −0 | |
| @cyforkk 💻 | Made errors readable: replaced bare HTTP status codes with real API error messages in chat. | 1 | +32 / −11 | |
| @icn5381 💻 | See their commits → | 1 | +15 / −4 |
Numbers come straight from git history and refresh automatically on every push to main.
Code is one way in, but not the only one - we follow the All Contributors spec, so a sharp bug report, a design suggestion that sticks, or a doc fix all count: 💻 code · 📦 platform · 📖 doc · 🐛 bug · 🤔 ideas · 🎨 design · ⚠️ test · 👀 review · 🚧 maintenance
When your contribution lands, comment this on the PR or issue and the bot handles the rest:
@all-contributors please add @your-username for code, doc
New here? CONTRIBUTING.md has setup steps and a list of good first issues.
See CONTRIBUTING.md for setup steps and good first issues, and PROJECT_VISION.md for what the project is optimizing for and where it is headed.
Python
77.5%
HTML
14.3%
JavaScript
7.8%
Fully local AI assistant that watches your screen to eliminate the context problem. No cloud. No data leakage.
16
stars
178
commits
Python
primary language
Sep 11, 2026
updated
A fully local AI assistant that watches your work to build context automatically without needing to explain much to an LLM. 100% private - no cloud, no data leakage.
Clippy Vision is a desktop AI companion that passively observes your work - active windows, clipboard, typing patterns, and screenshots - and builds a continuously updating memory of everything you do. When you open the chat, it already knows your context. No copy-pasting. No re-explaining.
Everything runs entirely on your machine. No API keys, no cloud, no data leaving your device.
Your work is not stored in one place. It is spread across the browser, your IDE, local PDFs, terminal output, chat apps, notes files, spreadsheets, and design tools. Each of those keeps its own partial record, or none at all, and none of them know about each other.
Clippy watches all of them and keeps one timeline. Two things follow from that, and neither is possible from any single app's own history:
2103.00020v1.pdf, a Jira ticket referred to only by its ID, a config you edited in a nameless scratch buffer. Clippy read the content, so the words that were actually in front of you are what you search.Claude and ChatGPT are built for reasoning, writing, and general knowledge. They are excellent when you bring them context. They are not built to know what was on your screen yesterday without you telling them.
Clippy Vision is built for the context problem. It watches your work, remembers it, and answers from that memory. It does not replace Claude or ChatGPT. It fills the gap they cannot: your personal activity history.
| Per-app history (browser, recent files) | Claude / ChatGPT | Clippy Vision | |
|---|---|---|---|
| Sees | Names and timestamps, one app at a time | Whatever you paste or upload | Screen content across every app |
| Answers with | A list to scan | Its general knowledge | What you were actually doing |
| Needs you to reconstruct context | Yes | Yes | No - already saw it |
| Runs where | Local | Cloud | 100% on your machine |
| Best for | "Which tab or file did I open?" | "Help me solve / write / explain this" | "What was I doing / reading / debugging?" |
Use Clippy when you need your own work history back. Use Claude or ChatGPT when you need a strong reasoning partner. Many people use both: Clippy to reconstruct context, then paste that into Claude to go deeper.
One question. Answer pulled from papers, chat tools, and a local notes file from the same research stretch.
Same kind of personal question. Clippy answers from activity it saw on your machine. Claude has no record of that work, because it never saw it.
Click your platform to download v1.2.2 directly:
All releases & older versions
·
The installer includes a setup wizard that handles Python, Ollama, and all required models automatically. No terminal required.
Clippy Vision is under active development. Three releases shipped in the first two weeks, including full macOS support, and bug reports usually get a reply the same day.
Trying Clippy? Share feedback (5 min) to help shape what we build next.
Clippy Vision runs a local text model for chat and uses accessibility APIs plus OCR for screen capture (no vision model in the capture path).
| Minimum | Recommended | |
|---|---|---|
| OS | Windows 10 / 11 (64-bit) | Windows 11 |
| System RAM | 8 GB | 16 GB |
| GPU VRAM | Not required (integrated OK) | 4 GB+ dedicated |
| Free disk | 8 GB | 10 GB+ |
qwen3:8b, ~4.7 GB).git clone https://github.com/protocorn/clippy-vision.git
cd clippy-vision\electron-ui
npm install
npm start
The app will open the setup wizard on first launch and walk you through dependencies.
Clippy is reactive today: you ask, it answers. The next bet is making it proactive, so it can act on what it sees instead of waiting to be asked. Capture now reads window text through accessibility APIs and falls back to local OCR without loading a vision model. A timeline view remains another priority so you can see and delete exactly what was captured.
No dates attached to any of it. PROJECT_VISION.md has the current thinking, the priority order, and an honest list of what does not work yet. If you want to shape any of it, the open issues are the place to start.
| Layer | Technology |
|---|---|
| Desktop UI | Electron |
| Backend | Python / FastAPI / Uvicorn |
| Local LLM runtime | Ollama |
| Main reasoning model | qwen3:8b |
| Screenshot text | Accessibility APIs + RapidOCR fallback |
| Embedding model | Bundled all-MiniLM-L6-v2 (event RAG is opt-in) |
| Query classifier | Fine-tuned MiniLM-L3 |
| Database | SQLite (WAL mode) |
| Screen capture | mss, pywin32, pynput |
core/screen_capture.py runs as a background process and captures:
core/screenshot_scheduler.py)Every captured event passes through a three-tier classification pipeline before being stored:
Tier 0 - Rule-based (deterministic, instant) Fast rules that immediately flag obvious signals: too few keystrokes → not interesting; known background system process → not interesting; typing deviation from personal baseline → interesting (score 9).
Tier 1 - Feature-based (scoring) Scoring starts at 5. Multiple features add or subtract: typing deviation, context novelty (how many times this app was seen in 7 days), typing intensity z-score, clipboard content length. Events below 4 are dropped; above 7 are kept; 4-7 go to Tier 2.
Tier 2 - LLM fallback
The last 3 events + current event are sent to qwen3:8b for context-aware classification. Output is INTERESTING or NOT_INTERESTING; classification never queues a vision model.
Screen text enrichment
Each captured frame records bounded text from the foreground accessibility/UI API. RapidOCR runs only when that text is empty or too sparse. A background processor (core/screenshot_processor.py) groups visually identical screenshots using perceptual hashing and stores the resulting text with the nearest event (±10 s); if none exists, it creates a screenshot_analysis event. Image embeddings and event-level RAG are disabled by default.
A background summarizer runs every 5 minutes and groups recent interesting events into session summaries using qwen3:8b. It runs in two passes per tick:
Runs every 5 sessions and extracts high-level behavioral facts from summaries. Each fact is:
Conflicting facts are preserved in memory_conflicts and surfaced to the agent for user resolution. User-provided corrections via save_identity automatically close related conflicts.
A fine-tuned MiniLM-L3 classifier (agent/router.py) maps every incoming query to one of:
| Category | What it covers |
|---|---|
time_anchored | "What was I doing yesterday at 3 PM?" |
topic_search | "What did I work on related to Clippy?" |
specific_recall | "What URL was I reading this morning?" |
memory_query | Questions about facts Clippy has memorized |
casual | General chat, no retrieval needed |
Each category has a dedicated prefetch module. Context is retrieved in parallel before the LLM is called, so the agent already has relevant data in its prompt without needing to make tool calls reactively.
A ReAct agent (agent/react_agent.py) with function calling. Tools available:
| Tool | Description |
|---|---|
search_sessions | SQL queries against the sessions/summaries table |
search_events | SQL queries against the raw events table |
recall_memory | Lists all memory cluster labels |
fetch_cluster | Fetches facts from a specific cluster |
save_identity | Saves autobiographical details |
save_note | Saves explicit things the user wants remembered |
Prompt components: conversation history (last 8 turns + rolling summaries), user profile, top-8 memory facts by semantic similarity, and prefetched context from the router.
All data lives in a local SQLite database (core/data/events.db):
| Table | Contents | Retention |
|---|---|---|
events | Raw captured events | 7 days |
sessions | Summaries of events | 90 days |
memory_clusters | Cluster metadata | Permanent |
memory_facts | Individual long-term facts | Permanent |
memory_conflicts | Unresolved fact contradictions | Permanent |
memory_meta | Settings and distiller state | Permanent |
conversations | Full conversation history | Permanent |
user_profile | User name | Permanent |
FTS5 virtual tables on events and sessions enable full-text search across all stored content.
127.0.0.1 on a port chosen at launch, so it is never reachable from your network.The one outbound request: Clippy Vision checks the public GitHub releases page for a newer version, at most once every 12 hours. It sends no chat, screen, profile, or account data — only the request itself, like opening the releases page in a browser. Turn it off any time under Settings → Updates.
# Python dependencies
pip install -r requirements.txt
# Run the desktop app
cd electron-ui
npm install
npm start
# Build the Windows installer
npm run dist
The built installer appears at electron-ui/dist/ClippyVision-Windows-Setup-{version}.exe (or ClippyVision-macOS-{arch}-{version}.dmg when building on macOS).
MIT - see LICENSE for details.
Every feature in Clippy Vision has a person behind it. This wall is how we say thank you - by name, with what they actually built, backed by real numbers from git history.
| Contributor | What they built | Commits | Lines | |
|---|---|---|---|---|
| @protocorn 💻 📖 🎨 🤔 🚧 | Designed the core app: agent, vision pipeline, memory system, and the Electron desktop shell. | 89 | +93,446 / −3,132 | |
| @rusetiq 💻 📦 | Brought Clippy Vision to macOS: native screen capture, permissions, and Apple Silicon + Intel packaging. | 8 | +39,032 / −3,226 | |
| @ABarpanda 💻 | See their commits → | 4 | +278 / −217 | |
| @vitorparras 💻 | See their commits → | 1 | +188 / −0 | |
| @vaishn4vi 💻 | See their commits → | 2 | +120 / −41 | |
| @adity982 💻 | See their commits → | 2 | +98 / −18 | |
| @Draoui-Haroun 💻 | See their commits → | 2 | +68 / −7 | |
| @shaurya703 💻 | See their commits → | 1 | +49 / −0 | |
| @cyforkk 💻 | Made errors readable: replaced bare HTTP status codes with real API error messages in chat. | 1 | +32 / −11 | |
| @icn5381 💻 | See their commits → | 1 | +15 / −4 |
Numbers come straight from git history and refresh automatically on every push to main.
Code is one way in, but not the only one - we follow the All Contributors spec, so a sharp bug report, a design suggestion that sticks, or a doc fix all count: 💻 code · 📦 platform · 📖 doc · 🐛 bug · 🤔 ideas · 🎨 design · ⚠️ test · 👀 review · 🚧 maintenance
When your contribution lands, comment this on the PR or issue and the bot handles the rest:
@all-contributors please add @your-username for code, doc
New here? CONTRIBUTING.md has setup steps and a list of good first issues.
See CONTRIBUTING.md for setup steps and good first issues, and PROJECT_VISION.md for what the project is optimizing for and where it is headed.
Python
77.5%
HTML
14.3%
JavaScript
7.8%