Local-first PC activity recorder for Windows. Captures screenshots, accessibility text, UI events, clipboard activity, and optional audio transcription into a local SQLite database — then exposes...
개요
DeskMate is a desktop activity recorder for . It captures your screenshots, on-screen text (OCR / accessibility tree), keyboard/mouse/clipboard events, and optional audio transcription into a SQLite database , then lets you use that data through a browser UI, a REST API, and an that plugs straight into AI coding agents like and — so your assistant can search your activity, ask natural-language questions, and run auto-generated reports (see MCP server). If you just want to try it out, follow these 4 steps. You need . - If it's not installed, get it from https://www.python.org/downloads/ and during installation. - Verify: open PowerShell and run python --version — you should see Python 3.10.x or higher. Every time you open a new terminal to use DeskMate, cd into the folder and run ..venv\Scripts\Activate.ps1 again to activate the environment. You'll know it worked when you see (.venv) at the start of your prompt. This installs: . That's enough for most people. (What each [...
README
DeskMate
DeskMate is a local-first desktop activity recorder for Windows. It captures your screenshots, on-screen text (OCR / accessibility tree), keyboard/mouse/clipboard events, and optional audio transcription into a SQLite database on your own machine, then lets you use that data through a browser UI, a REST API, and an MCP server that plugs straight into AI coding agents like Claude Code and Cursor — so your assistant can search your activity, ask natural-language questions, and run auto-generated reports (see MCP server).
All your data stays on your own computer — nothing is uploaded to the cloud.
🚀 Quick Start (5 minutes — just get it running)
If you just want to try it out, follow these 4 steps. You don’t need to understand anything below this section.
Step 1 — Install Python (if you don’t have it)
You need Python 3.10 or newer.
- If it’s not installed, get it from and check “Add Python to PATH” during installation.
- Verify: open PowerShell and run
python --version— you should seePython 3.10.xor higher.
Step 2 — Get the code and create an isolated environment
git clone
cd deskmate
# Create an isolated Python environment (keeps your system clean)
python -m venv .venv
.\.venv\Scripts\Activate.ps1
Every time you open a new terminal to use DeskMate,
cdinto the folder and run.\.venv\Scripts\Activate.ps1again to activate the environment. You’ll know it worked when you see(.venv)at the start of your prompt.
Step 3 — Install (recommended default combo)
pip install -e ".[ocr-winrt,audio,vad,mcp]"
This installs: core features + built-in Windows OCR + audio transcription + voice
activity detection + MCP. That’s enough for most people.
(What each [...] means and what else you can add → see Install features as needed.)
Step 4 — Launch
deskmate ui
Your browser opens at http://127.0.0.1:3030/ui and DeskMate starts recording.
On first run it auto-creates a config and data folder under
C:\Users\\.deskmate\. You’re up and running.
To stop: press
Ctrl + Cin the terminal wheredeskmate uiis running.
🧩 Install features as needed (submodule dependencies)
DeskMate splits the “heavy” features into optional modules (extras) — install only what you need, not everything at once. The install format is always:
pip install -e ".[module-name]" # install one
pip install -e ".[module1,module2]" # install several (comma-separated, NO spaces)
| Module | What it adds | When you need it / notes |
|---|---|---|
ocr-winrt |
Built-in Windows OCR | Recommended default, no extra downloads |
ocr-rapidocr |
PP-OCR (via OpenVINO) | Best for Chinese / small UI text, models bundled |
ocr-tesseract |
Tesseract OCR | Requires Tesseract installed and on PATH |
audio |
Recording + Whisper transcription | Needs a mic or system audio (WASAPI). Default transcription backend |
audio-openvino |
Whisper on Intel NPU/GPU/CPU | Accelerated on Intel Core Ultra (NPU) or Arc GPU, see below |
vad |
Voice activity detection (Silero VAD) | Skips silent segments to save compute; install alongside audio |
speaker |
Speaker diarization | Tells “who said what” |
redact-onnx |
PII redaction | Optional privacy-protection model |
semantic |
Semantic (vector) search | Search by meaning, not just keywords |
pipes |
Scheduled tasks (YAML) | Run reports automatically on a schedule |
mcp |
MCP server | Integrate with AI agents / Claude, etc. |
training |
Local LoRA fine-tuning | Fine-tune a small model on your own data, see training docs |
full |
Most common extras at once | = tesseract + audio + vad + redact + semantic + pipes. Excludes OpenVINO & training |
dev |
Dev tools (pytest, ruff) | Only needed to modify code / run tests |
Beginner tip: start with the default combo from Step 3. Add a module later when you decide you want a feature (e.g. Chinese OCR, semantic search) — re-running
pip install -e ".[...]"is safe.Battery Saver / Power Manager is built in and uses Windows APIs through the standard library; it does not need an extra package.
Install from a built wheel (instead of the source checkout)
If you have the built .whl (see Building a wheel below)
instead of the source tree, use the same [extras] syntax on the wheel file:
:: core only
pip install deskmate-0.1.0-py3-none-any.whl
:: recommended combo (same as Step 3)
pip install "deskmate-0.1.0-py3-none-any.whl[ocr-winrt,audio,vad,mcp]"
Install (almost) everything in one go — every optional feature at once. Note there is no single “all” extra, so list them explicitly. This pulls in the heavy deps (PyTorch, OpenVINO, ONNX Runtime, Whisper, RapidOCR…), so expect a large download:
pip install "deskmate-0.1.0-py3-none-any.whl[ocr-tesseract,ocr-rapidocr,ocr-winrt,audio,audio-openvino,vad,speaker,redact-onnx,semantic,mcp,pipes]"
This deliberately omits
training(LoRA fine-tuning — only needed if you train models; see training docs),redact-onnx-dml(the DirectML build ofredact-onnx— pick one, not both), anddev(test tooling). The same works on the source checkout — just swap the wheel filename for-e ".", e.g.pip install -e ".[ocr-winrt,audio,vad,speaker,semantic,mcp,pipes]".⚠️ Most extras pull Windows-only / GPU-specific wheels and large model runtimes. Don’t install everything unless you actually need it — the recommended combo is enough for most users.
📦 Building a wheel (for distribution)
To produce a distributable wheel (e.g. to install on another machine):
pip install build
python -m build --wheel :: output: dist\deskmate-0.1.0-py3-none-any.whl
The wheel bundles all of DeskMate’s own code and the built-in apps
(deskmate/apps/), but not third-party dependencies — those are recorded as
requirements and fetched by pip install from PyPI. For an offline install,
pre-download everything into a folder first:
pip download "deskmate-0.1.0-py3-none-any.whl[ocr-winrt,audio,vad,mcp]" -d wheelhouse
:: then on the offline machine:
pip install --no-index --find-links wheelhouse "deskmate[ocr-winrt,audio,vad,mcp]"
🧠 Installing the training extra (LoRA fine-tuning)
The training extra (torch + unsloth + transformers + peft + accelerate)
is deliberately left out of the “everything” command above, because the right
torch build depends on your accelerator. A pip [extra] can’t pin a
hardware-specific wheel (the Intel XPU torch lives on PyTorch’s own index, not
PyPI). Below, WHL = deskmate-0.1.0-py3-none-any.whl; on a source checkout use
-e "." instead.
Intel Arc / Core-Ultra iGPU (XPU): the XPU torch wheel and an
oneAPI/Level-Zero/MSVC toolchain are required — there are several non-obvious
gotchas, so this path is scripted. Install the extra, then run the setup script:
pip install "WHL[training]"
scripts\setup-intel-xpu.bat :: pulls torch 2.10.0+xpu + Level-Zero SDK headers
Full walkthrough (oneAPI, MSVC, the toolchain gotchas) → training docs.
CPU only (no GPU — slow, for validating the pipeline on a tiny base like
Qwen/Qwen3-0.6B, not real ≥1B runs):
pip install "WHL[training]" :: the default torch is already CPU-only
Verify XPU is live after setup:
python -c "import torch; print(torch.__version__, getattr(torch, 'xpu', None) is not None and torch.xpu.is_available())" :: expect: 2.10.0+xpu True
🤖 Want Q&A / auto-reports? Install Ollama first (optional but recommended)
DeskMate’s natural-language Q&A (Ask) and the LLM apps under My Apps (daily recap, todo extraction, meeting summaries…) need a local LLM server, Ollama. If you don’t use these, you can skip this section — recording and search work fine without it.
💡 Recommended: use the Ollama OpenVINO build on Intel hardware If you’re on an Intel CPU / Arc GPU / Core Ultra (NPU), we strongly recommend Ollama-OV (OpenVINO backend) — it runs models on Intel CPU/GPU/NPU, faster and more power-efficient: 👉 . On regular GPUs / other platforms, the official Ollama works fine.
Option A — Ollama OpenVINO build (recommended on Intel)
- Follow to get
ollama.exeand start the service (see that repo’s README). - Import a model in OpenVINO IR format as described there (get it from HuggingFace /
ModelScope → write a
ModelfilewithModelBackend "OpenVINO"→ollama create -f Modelfile). - Put the model name into
config.toml(below).
Option B — Official Ollama (other platforms / simplest)
- Install Ollama: (it runs a local service in the
background at
http://127.0.0.1:11434). - Pull a model:
ollama pull qwen3.
Final step for both options — in C:\Users\\.deskmate\config.toml,
set the model name to the one you actually have:
[ollama]
base = "http://127.0.0.1:11434"
model = "qwen3_8b_ov:v1" # OpenVINO build: the name you imported it as.
# Official build: the name you pulled (e.g. qwen3).
Then restart deskmate ui — you can now use Ask on the Home page and run reports under My Apps.
⚡ Advanced features (read when you need them)
These are more specialized capabilities - beginners can ignore them for now and come back when needed:
| Feature | One-liner | Docs |
|---|---|---|
| OpenVINO-accelerated transcription | Run Whisper faster on Intel NPU/GPU | docs/04-audio.md |
| Live speech translation | Translate as you speak, shown in the UI | docs/18-live-translation.md |
| Video-call detection | Auto-detect Teams/Zoom/Meet + meeting notes | docs/09-meeting-workflow.md |
| Gmail / Outlook integration | Search real mailboxes in Ask and apps | docs/11-connections.md |
| Battery Saver | On battery, move background AI work and user-selected apps onto efficient cores; the SPA view and live status text are localized in Chinese/English | docs/22-power-manager.md |
| Local LoRA fine-tuning | Train a small model on your data (incl. Intel iGPU) | docs/16-learning-training.md |
| All technical design docs | Architecture of every module | docs/README.md |
OpenVINO Whisper quick setup (Intel devices):
pip install -e ".[audio-openvino,vad]"
Then in config.toml:
[audio]
whisper_backend = "openvino_genai" # default is "onnx_cpu"
openvino_device = "NPU" # NPU | GPU | CPU | AUTO
The model is auto-downloaded from ModelScope on first use; if the chosen device fails to load, it automatically falls back to CPU.
LoRA training (Intel GPU) has a one-click setup script — see scripts/setup-intel-xpu.bat and docs/16.
Requirements
- Windows 10 / 11
- Python 3.10+
- Optional, by feature:
- OCR:
ocr-winrtneeds nothing extra;ocr-tesseractneeds Tesseract on PATH;ocr-rapidocrjust needs the extra (best for Chinese) - Audio: a microphone, or a system-audio loopback (WASAPI) device
- OpenVINO acceleration: an Intel CPU; an Intel Core Ultra (NPU) or Arc/iGPU unlocks NPU/GPU inference
- Q&A & apps: a local Ollama server
- LoRA training: a GPU is recommended (CPU works but is slow)
- OCR:
Everyday usage
Browser UI
deskmate ui # record + API + auto-open /ui
deskmate ui --no-run-daemon # view existing data only, don't start new recording
| Page | What it does |
|---|---|
| Home | Health status, recent activity, Ask (natural-language queries) |
| Apps | Run built-in and plugin LLM apps; configure schedules and time ranges |
| Connect Gmail / Outlook and review mailbox integration status | |
| Timeline | Browse the screenshot timeline |
| Transcripts | Audio transcriptions |
| Translate | Live speech translation controls and translated transcript stream |
| Events | Keyboard / mouse / clipboard / window-focus events |
| Todos | Action items extracted from email + meetings |
| Meetings | Detected video calls, transcripts, one-click summary |
| Capture | Capture-control view for recording sources and runtime toggles |
| Training | Local LoRA fine-tuning |
| Model Service | Start/stop local model backends and inspect service logs |
| Diagnostics | Environment self-checks for common setup issues |
| Reminders | Proactive habit reminders, acknowledgement, and history |
| Battery Saver | EcoQoS battery saver for background AI workers and selected apps; UI text is localized in Chinese/English |
| Settings | Config and monitors |
CLI
deskmate serve # HTTP API only (records by default)
deskmate record # recorder only
deskmate capture-once # capture one frame manually
deskmate search "query" # keyword search via the API
deskmate mcp # MCP server for AI agents (see "MCP server" below; API must be running)
Split API and recorder into two processes:
deskmate record
deskmate serve --no-run-daemon
LLM apps (My Apps)
Built-in apps live in deskmate/apps/ (and ship inside the installed package);
your own apps go in ~/.deskmate/apps/plugins/. Run them from the My Apps
page or the CLI. Full list, examples, and how to write your own in
deskmate/apps/README.md.
| App | Purpose |
|---|---|
todo-list |
Unified checkbox todos from email + meetings |
meeting-summary |
Summarize the meeting that just ended |
email-digest |
Inbox overview |
email-compose |
Draft / reply via Gmail or Outlook |
day-recap / time-breakdown / ai-habits |
Daily recap / time split / AI-tool usage habits |
user-profile / habit-report |
Multi-day user profile / routine (default: last 7 days) |
These apps need both Ollama and the DeskMate API running.
Configuration
Config file: C:\Users\\.deskmate\config.toml (auto-created on first run).
Main sections: [capture], [a11y], [ocr], [audio], [ollama], [redact],
[filters], [server]
Override with environment variables (prefix DESKMATE_):
$env:DESKMATE_SERVER__PORT = "4040"
$env:DESKMATE_AUDIO__ENABLED = "true"
Where your data lives
C:\Users\\.deskmate\
├── config.toml # configuration
├── data.db # SQLite database (with full-text search)
├── frames\ # screenshots
├── audio\ # audio chunks (when enabled)
├── videos\ # video chunks
├── checkpoints\ # LoRA training artifacts (when training)
├── apps\ # LLM app output reports; apps\plugins\ for your own apps
└── logs\ # logs
To wipe and start over: stop DeskMate, then delete data.db and the folders above.
API
Default base URL: http://127.0.0.1:3030. Full endpoint list is in the running
server’s /docs (OpenAPI). Common ones:
GET /health GET /search?q=... POST /ask
GET /frames POST /capture GET /meetings
GET /todos POST /todos PATCH /todos/{id}
🔌 MCP server (use DeskMate from AI agents)
DeskMate ships an MCP stdio server so other AI
agents (Claude Desktop, IDE assistants, custom clients) can query your local
activity and drive DeskMate’s Q&A and report apps. It’s a thin proxy over the
local HTTP API, so the DeskMate API must already be running (deskmate serve
or deskmate ui).
Install & launch
pip install -e ".[mcp]" # or add `mcp` to your extras combo
deskmate serve # in one terminal — the API on :3030
deskmate mcp # in another — the MCP stdio server
Tools exposed (all prefixed deskmate_ so they don’t collide with other MCP servers):
| Tool | Kind | What it does |
|---|---|---|
deskmate_search |
read | Full-text search over frames (OCR + a11y text), UI events, audio transcripts |
deskmate_recent_frames |
read | List the latest captured frames |
deskmate_recent_events |
read | List latest UI events (clicks, focus, key text, clipboard) |
deskmate_health |
read | Daemon liveness + counters |
deskmate_capture_once |
action | Trigger a paired capture now |
deskmate_ask |
action | Natural-language Q&A: an LLM searches your local context and answers (slow) |
deskmate_list_apps |
read | List the report apps (day-recap, standup-update, todo-list, meeting-summary, email-compose, …) |
deskmate_run_app |
action | Run a report app and return its result (slow; params vary per app) |
deskmate_list_app_outputs |
read | List an app’s past run outputs |
deskmate_get_app_output |
read | Fetch one output file (markdown/json) of a past run |
deskmate_askanddeskmate_run_appinvoke a local LLM, so they need Ollama + the API running and can take tens of seconds to minutes.
💡 Why connect it to Claude Code / Cursor?
Once DeskMate is registered, your coding assistant knows what you’ve been doing locally — no copy-pasting context. While you work in Claude Code or Cursor you can ask:
deskmate_ask — natural-language Q&A over your activity
- “Use deskmate to recap the last hour: which apps I used, how long on each, and what I was doing — as a timeline.”
- “Ask deskmate: between 2pm and 4pm today, what task was I mainly working on, and which files/windows were involved?”
- “From my local activity record (deskmate), what was I last reading about in the browser?”
deskmate_search — full-text search over OCR / UI / audio
- “Use deskmate to search my screen OCR, UI text and audio transcripts for ‘recursive doubling’, list the hits by time with the app/window they appeared in.”
- “Use deskmate to find frames in the last 3 hours whose OCR text contains ‘error’ or ‘exception’, and tell me which app each was in.”
- “Use deskmate to find which .py files I opened in VS Code today.”
deskmate_list_apps / run_app — report apps
- “Use deskmate to list all available report apps and what each one does.”
- “Use deskmate to run the time-breakdown report for the last hour.”
- “Use deskmate to run day-recap and summarize what I did today.”
- “Use deskmate to run standup-update: what I did, what’s next, and any blockers.”
deskmate_recent_events / recent_frames — raw activity stream
- “Use deskmate to show my last 50 UI events (clicks/focus/typing/clipboard) and summarize what I was just doing.”
- “Use deskmate to list the last 20 captured frames and tell me which apps/windows I’ve been switching between.”
deskmate_health / capture_once — status & instant capture
- “Use deskmate to check whether the recorder daemon is healthy and how many frames/transcripts it has captured.”
- “Use deskmate to capture the screen right now and tell me what’s on it.”
deskmate_list_app_outputs / get_app_output — past reports
- “Use deskmate to list day-recap’s past report runs and show me the contents of the latest one.”
The assistant reads your local activity record on demand and answers in-context, entirely on your machine.
Register the server
Point command at the Python env that has the mcp extra installed.
Claude Code (CLI):
claude mcp add deskmate -e DESKMATE_API=http://127.0.0.1:3030 \
-- C:/path/to/env/python.exe -m deskmate mcp
# verify: claude mcp list (should show deskmate ✓ connected)
Cursor — add to ~/.cursor/mcp.json (global) or /.cursor/mcp.json:
{
"mcpServers": {
"deskmate": {
"command": "C:/path/to/env/python.exe",
"args": ["-m", "deskmate", "mcp"],
"env": { "DESKMATE_API": "http://127.0.0.1:3030" }
}
}
}
Claude Desktop — same block in claude_desktop_config.json.
After editing config, fully restart the client — MCP servers are only loaded at startup.
Notes
DESKMATE_API(optional) overrides the API base URL; defaults tohttp://127.0.0.1:3030.- Slow tools / timeouts:
deskmate_askanddeskmate_run_appinvoke a local LLM and can take minutes. The server-side budget defaults to 30 min and is configurable viaDESKMATE_MCP_ASK_TIMEOUT/DESKMATE_MCP_RUN_APP_TIMEOUT(seconds, in the server’senv). These tools also stream MCP progress every ~15s, which keeps most clients from cutting the call off; if your client still times out, raise its tool timeout withMCP_TOOL_TIMEOUT(milliseconds; e.g.1800000for 30 min). - Behind a corporate proxy? No action needed — the MCP server talks only to
the local API and deliberately ignores
HTTP(S)_PROXY, so127.0.0.1traffic is never routed through a proxy. - The MCP server and the daemon are independent processes coupled only by the
API, so the MCP server can run from a different environment than the daemon —
it just needs the
mcpextra.
FAQ
- Install error / a feature is missing? Most likely the matching extra isn’t installed. Go back to Install features as needed and add that one.
- Ask / My Apps does nothing or errors? Check that Ollama is running
(
ollama listshould list models) and that[ollama] modelinconfig.tomlmatches a model you actually have. On Intel hardware, use the Ollama OpenVINO build (the default model nameqwen3_8b_ov:v1is meant for it). deskmatenot found in a new terminal? You didn’t activate the virtual environment.cdinto the project folder, then run.\.venv\Scripts\Activate.ps1.- Want the internals / finer config of a feature? It’s all in docs/, numbered by module.
License
MIT — see LICENSE.
DeskMate is free to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, subject to the MIT license terms.
설치
This server does not publish a one-line install command.
Open the repository installation guide설정
{
"mcpServers": {
"deskmate": {
"command": "C:/path/to/env/python.exe",
"args": ["-m", "deskmate", "mcp"],
"env": { "DESKMATE_API": "http://127.0.0.1:3030" }
}
}
}