# local memory for AI agents
Source: https://docs.screenpipe.com/agent-memory-workflow
Give Claude, Codex, Cursor, and other AI agents continuity across sessions with small source-backed local context files built from screenpipe history.
screenpipe cannot restore an AI model's hidden context. it can give the next session a local record of recent work: what changed, what was decided, what remains open, and where the evidence came from.
## two ways to start
| method | choose it when |
| --------------------------- | --------------------------------------------------------------------- |
| [MCP](/mcp-server) search | the agent should query recent screen history on demand |
| periodic local context file | several tools need the same compact project state over days or months |
```mermaid theme={null}
flowchart TD
A["bounded screenpipe history"] --> B["extract facts and open loops"]
B --> C["reviewed local context file"]
C --> D["Claude, Codex, Cursor, or another agent"]
D --> E["new work"]
E --> A
```
## build a context file
Start with one Markdown file in a private project folder, wiki, or Obsidian vault. avoid creating several competing memory stores on day one.
Keep current objectives, recent changes, decisions, open loops, blockers, and source time ranges. separate durable facts from short-lived activity.
Ask screenpipe or your MCP-connected agent to review a bounded period and update the file. require it to preserve still-valid entries and mark missing evidence.
Remove secrets and irrelevant personal detail. confirm that decisions were accepted rather than merely discussed.
Add one line to the project's agent instructions telling tools to read the file at the start of relevant work and update it only under your chosen policy.
Once manual updates are reliable, run the pipe hourly or daily. keep a last-updated time and an explicit “no new evidence” state.
## starter schema
```markdown theme={null}
# project context
last reviewed:
source window: to
## current objective
- ...
## recent verified changes
- fact — source: ,
## decisions
- accepted decision — owner — date
## open loops
- action — owner if known — status — source
## blockers and unknowns
- ...
## sensitive details intentionally omitted
- ...
```
## update prompt
```markdown theme={null}
Update the local project context from this bounded screenpipe history.
Preserve still-valid facts from the existing file.
Add only facts supported by the supplied results.
Distinguish decisions from proposals and completed work from viewed work.
Keep source app or meeting and time range for each material change.
If the source is missing, record an unknown instead of guessing.
Never store secrets, tokens, raw private conversations, or unrelated personal data.
```
a memory file concentrates context. keep it local or in an access-controlled repository, exclude secrets, and define retention before scheduling recurring updates.
# give AI memory of your screen
Source: https://docs.screenpipe.com/ai-memory
Give Claude, Cursor, Ollama, and other LLMs persistent memory of everything on your screen so they can answer questions with full context.
screenpipe acts as a memory layer for AI — it gives LLMs context about what you've been doing on your computer.
## why AI needs memory
LLMs are stateless — they don't know what you were working on 5 minutes ago. screenpipe bridges this by:
* capturing everything on your screen 24/7
* extracting app text primarily via accessibility APIs, with OCR fallback for visual-only surfaces
* making it searchable via REST API on `localhost:3030`
## connect to AI
### MCP (recommended)
screenpipe has a built-in MCP server that works with Claude Desktop, Cursor, and other MCP-compatible tools:
```json theme={null}
{
"mcpServers": {
"screenpipe": {
"command": "npx",
"args": ["-y", "screenpipe-mcp"]
}
}
}
```
or run `npx -y screenpipe@latest agent setup ` (`claude-desktop`, `cursor`, `claude-code`, `codex`, `openclaw`, `hermes`, `windsurf`) to install the screenpipe skills and register the MCP server in one command.
see [MCP server setup](/mcp-server) for details.
### pipes (scheduled agents)
[pipes](/pipes) are AI agents that run on a schedule and act on your screen data automatically — like syncing to Obsidian, tracking time in Toggl, or sending daily summaries. spin one up from the CLI — `npx -y screenpipe@latest pipe install && npx -y screenpipe@latest pipe enable ` (`bunx` / `bun x` work too) — or ask any connected agent to build one for you.
### direct API
any tool that can make HTTP requests can query screenpipe:
```bash theme={null}
# get recent screen activity
curl "http://localhost:3030/search?content_type=all&limit=20"
# search for specific content
curl "http://localhost:3030/search?q=meeting+notes&app_name=Slack&limit=10"
```
the local API needs no auth by default. if you've enabled API auth in settings, add `-H "Authorization: Bearer "` to these requests.
## use cases
| use case | how |
| ---------------------------- | -------------------------- |
| "what was I working on?" | search by time range |
| "summarize today's meetings" | query audio transcriptions |
| "find that code snippet" | search screen text |
| "auto-track my time" | toggl-sync pipe |
| "sync activity to notes" | obsidian-sync pipe |
## privacy-first
* all data stays on your device
* use local LLMs (Ollama, LMStudio) for complete privacy
* filter what gets captured in **settings → privacy** — ignore or include specific apps, windows, and URLs ([privacy filters](/privacy-filter))
* no data sent to cloud unless you explicitly choose cloud providers
## next steps
* [build a second brain](/second-brain) — let your agent watch your activity and remember your workflows in the background
* [set up MCP server](/mcp-server) — connect to Claude, Cursor
* [set up pipes](/pipes) — scheduled AI agents
* [API reference](/cli-reference) — REST API search parameters and endpoints
* [join our discord](https://discord.gg/screenpipe) — get help from the community
## get screenpipe
screenpipe gives your AI assistants memory of everything on your screen.
[download screenpipe →](https://screenpi.pe/onboarding)
# screenpipe API recipes
Source: https://docs.screenpipe.com/api-recipes
Copy-paste recipes for the most useful screenpipe API workflows: search, meetings, speakers, frames, memories, retention, archive, and safe data deletion.
screenpipe runs a local API on `localhost:3030`. use these recipes when you want useful answers fast, then open the API reference for every parameter and response shape.
protected endpoints require API authentication. retrieve the local key once per shell:
```bash theme={null}
export SCREENPIPE_API_KEY="$(npx -y screenpipe@latest auth token)"
```
you can also reveal it in **Settings → Privacy → API security**. the examples below include the required bearer header. `/health` is the exception.
## 1. check that screenpipe is alive
```bash theme={null}
curl http://localhost:3030/health
```
use this before debugging MCP, pipes, or chat. if it fails, the app is not serving the local API yet.
## 2. search the last 24 hours
```bash theme={null}
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" \
"http://localhost:3030/search?limit=20&content_type=all&start_time=24h+ago&end_time=now"
```
`content_type=all` can return accessibility text, OCR fallback text, audio transcripts, input events, app names, window titles, and browser URLs.
## 3. search one app or website
```bash theme={null}
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" \
"http://localhost:3030/search?q=deployment&app_name=Slack&limit=20&start_time=24h+ago&end_time=now"
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" \
"http://localhost:3030/search?browser_url=github.com&limit=20&start_time=24h+ago&end_time=now"
```
use `app_name` for desktop app names and `browser_url` for web activity captured through browser metadata.
## 4. search a precise time window
```bash theme={null}
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" \
"http://localhost:3030/search?start_time=3h+ago&end_time=now&limit=50"
```
time filters accept relative values such as `3h ago` and `now`, or ISO 8601 UTC for an exact historical window. an explicit start and end is the safest way to debug “what happened during that call?”
## 5. search meeting audio
```bash theme={null}
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" \
"http://localhost:3030/search?q=budget&content_type=audio&limit=20&start_time=7d+ago&end_time=now"
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" \
"http://localhost:3030/search?content_type=audio&speaker_name=Sarah&limit=20&start_time=7d+ago&end_time=now"
```
speaker filters work best after you name or merge speakers in the meeting transcript sidebar or through the speaker APIs.
## 6. summarize activity for an agent
```bash theme={null}
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" \
"http://localhost:3030/activity-summary?start_time=2h+ago&end_time=now"
```
use this when an AI agent needs a compact readout of a time range instead of raw search results.
## 7. manage speakers
```bash theme={null}
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" \
"http://localhost:3030/speakers/unnamed?limit=10"
curl -X POST http://localhost:3030/speakers/update \
-H "Authorization: Bearer $SCREENPIPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"id": 1, "name": "Sarah Chen"}'
curl -X POST http://localhost:3030/speakers/merge \
-H "Authorization: Bearer $SCREENPIPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"speaker_to_keep_id": 1, "speaker_to_merge_id": 2}'
```
speaker cleanup improves meeting search, transcript readability, and calendar-assisted speaker identification.
## 8. list and update meetings
```bash theme={null}
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" "http://localhost:3030/meetings?limit=20"
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" "http://localhost:3030/meetings/status"
curl -X POST http://localhost:3030/meetings/merge \
-H "Authorization: Bearer $SCREENPIPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"meeting_ids": [12, 13]}'
```
meetings are higher-level objects built from audio, transcript, timeline, and optional calendar context.
## 9. fetch frame text and context
```bash theme={null}
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" "http://localhost:3030/frames/123/text"
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" "http://localhost:3030/frames/123/context"
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" "http://localhost:3030/frames/123/metadata"
```
use frame endpoints when you already have a `frame_id` from search and need the captured text, surrounding accessibility context, OCR fallback data, or metadata.
## 10. search structured UI elements
```bash theme={null}
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" "http://localhost:3030/elements?q=submit&limit=20"
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" "http://localhost:3030/frames/123/elements"
```
elements come from the accessibility tree. they are useful for finding buttons, links, fields, and UI labels directly, instead of relying on visual OCR.
## 11. use read-only SQL
```bash theme={null}
curl -X POST http://localhost:3030/raw_sql \
-H "Authorization: Bearer $SCREENPIPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query":"select app_name, count(*) as n from frames group by app_name order by n desc limit 20"}'
```
`/raw_sql` only allows read-only queries such as `select`, `with`, and `explain`. writes are rejected.
## 12. work with memories
```bash theme={null}
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" "http://localhost:3030/memories?limit=20"
curl -X POST http://localhost:3030/memories \
-H "Authorization: Bearer $SCREENPIPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"content":"Important product insight from today", "source":"manual"}'
```
memories are durable notes that AI workflows can search later.
## 13. manage retention
```bash theme={null}
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" "http://localhost:3030/retention/status"
curl -X POST http://localhost:3030/retention/configure \
-H "Authorization: Bearer $SCREENPIPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"enabled": true, "days": 30}'
```
retention keeps disk usage bounded. pair it with archive if you want old recordings moved out before deletion.
## 14. archive old data
```bash theme={null}
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" "http://localhost:3030/archive/status"
curl -X POST http://localhost:3030/archive/run \
-H "Authorization: Bearer $SCREENPIPE_API_KEY"
```
archive is for moving older media to encrypted storage while keeping the local timeline searchable.
## 15. delete a time range
```bash theme={null}
curl -X POST http://localhost:3030/data/delete-range \
-H "Authorization: Bearer $SCREENPIPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"start_time":"","end_time":""}'
```
replace both placeholders with reviewed ISO 8601 UTC timestamps. data deletion is permanent; export or archive anything you need before deleting a range or device.
## filter cheat sheet
| parameter | use it when |
| ------------------------- | --------------------------------------------------------------- |
| `q` | searching for words or phrases |
| `content_type` | narrowing to `ocr`, `audio`, `input`, `accessibility`, or `all` |
| `app_name` | filtering to a desktop app |
| `window_name` | filtering to a window title |
| `browser_url` | filtering to a website or URL pattern |
| `speaker_name` | finding what one person said |
| `speaker_ids` | using exact speaker IDs after cleanup |
| `start_time` / `end_time` | constraining a meeting, work block, or incident |
| `limit` / `offset` | paging through larger result sets |
## next steps
* connect AI tools with [MCP server setup](/mcp-server)
* build automations with [pipes](/pipes)
* debug failed API calls in [troubleshooting](/troubleshooting)
# Get activity summary
Source: https://docs.screenpipe.com/api-reference/activity/get-activity-summary
/openapi.yaml get /activity-summary
Lightweight compressed activity overview for a time range.
Returns app usage, recent accessibility texts, and audio summary (~200-500 tokens).
# List audio devices
Source: https://docs.screenpipe.com/api-reference/audio/list-audio-devices
/openapi.yaml get /audio/list
Returns all available audio input and output devices.
# Start audio recording
Source: https://docs.screenpipe.com/api-reference/audio/start-audio-recording
/openapi.yaml post /audio/start
# Start recording a specific audio device
Source: https://docs.screenpipe.com/api-reference/audio/start-recording-a-specific-audio-device
/openapi.yaml post /audio/device/start
# Stop audio recording
Source: https://docs.screenpipe.com/api-reference/audio/stop-audio-recording
/openapi.yaml post /audio/stop
# Stop recording a specific audio device
Source: https://docs.screenpipe.com/api-reference/audio/stop-recording-a-specific-audio-device
/openapi.yaml post /audio/device/stop
# Configure archive settings
Source: https://docs.screenpipe.com/api-reference/cloud-archive/configure-archive-settings
/openapi.yaml post /archive/configure
POST /archive/configure — update retention or disable.
# Get archive status
Source: https://docs.screenpipe.com/api-reference/cloud-archive/get-archive-status
/openapi.yaml get /archive/status
GET /archive/status — return current state.
# Initialize cloud archive
Source: https://docs.screenpipe.com/api-reference/cloud-archive/initialize-cloud-archive
/openapi.yaml post /archive/init
POST /archive/init — initialize the archive system.
# Run archive now
Source: https://docs.screenpipe.com/api-reference/cloud-archive/run-archive-now
/openapi.yaml post /archive/run
POST /archive/run — trigger an immediate archive run.
# Download synced data
Source: https://docs.screenpipe.com/api-reference/cloud-sync/download-synced-data
/openapi.yaml post /sync/download
Download and import data from other devices.
# Get sync status
Source: https://docs.screenpipe.com/api-reference/cloud-sync/get-sync-status
/openapi.yaml get /sync/status
Get current sync status.
# Initialize cloud sync
Source: https://docs.screenpipe.com/api-reference/cloud-sync/initialize-cloud-sync
/openapi.yaml post /sync/init
Initialize sync at runtime with credentials.
# Lock sync
Source: https://docs.screenpipe.com/api-reference/cloud-sync/lock-sync
/openapi.yaml post /sync/lock
Lock sync (stop service and clear state).
# Pull pipe configs from cloud
Source: https://docs.screenpipe.com/api-reference/cloud-sync/pull-pipe-configs-from-cloud
/openapi.yaml post /sync/pipes/pull
Pull pipe manifest from cloud, merge with local, apply to disk.
# Push pipe configs to cloud
Source: https://docs.screenpipe.com/api-reference/cloud-sync/push-pipe-configs-to-cloud
/openapi.yaml post /sync/pipes/push
Push local pipe manifest to cloud (merge with remote first).
# Trigger sync
Source: https://docs.screenpipe.com/api-reference/cloud-sync/trigger-sync
/openapi.yaml post /sync/trigger
Trigger an immediate sync.
# Delete data in time range
Source: https://docs.screenpipe.com/api-reference/data-management/delete-data-in-time-range
/openapi.yaml post /data/delete-range
Permanently delete all captured data (frames, accessibility text, OCR fallback text, audio, etc.) within a time range.
# Delete device data
Source: https://docs.screenpipe.com/api-reference/data-management/delete-device-data
/openapi.yaml post /data/delete-device
Delete all locally-stored data that was synced from a specific remote device.
# Get device storage usage
Source: https://docs.screenpipe.com/api-reference/data-management/get-device-storage-usage
/openapi.yaml get /data/device-storage
Get record counts per synced device.
# Configure retention policy
Source: https://docs.screenpipe.com/api-reference/data-retention/configure-retention-policy
/openapi.yaml post /retention/configure
POST /retention/configure — enable/disable local retention, set days.
# Get retention status
Source: https://docs.screenpipe.com/api-reference/data-retention/get-retention-status
/openapi.yaml get /retention/status
GET /retention/status — return current retention state.
# Run retention cleanup now
Source: https://docs.screenpipe.com/api-reference/data-retention/run-retention-cleanup-now
/openapi.yaml post /retention/run
POST /retention/run — trigger an immediate cleanup run.
# Add content to database
Source: https://docs.screenpipe.com/api-reference/database/add-content-to-database
/openapi.yaml post /add
Manually insert screen or audio content into the database.
# Execute raw SQL
Source: https://docs.screenpipe.com/api-reference/database/execute-raw-sql
/openapi.yaml post /raw_sql
Execute a raw SQL query against the screenpipe database. Use with caution.
# Search UI elements
Source: https://docs.screenpipe.com/api-reference/elements/search-ui-elements
/openapi.yaml get /elements
Search elements across all frames with optional FTS, time, and app filters.
# Merge video frames
Source: https://docs.screenpipe.com/api-reference/experimental/merge-video-frames
/openapi.yaml post /experimental/frames/merge
# Validate media files
Source: https://docs.screenpipe.com/api-reference/experimental/validate-media-files
/openapi.yaml get /experimental/validate/media
# Get frame by ID
Source: https://docs.screenpipe.com/api-reference/frames/get-frame-by-id
/openapi.yaml get /frames/{frame_id}
Returns a captured screenshot frame with optional base64 image data.
# Get frame context
Source: https://docs.screenpipe.com/api-reference/frames/get-frame-context
/openapi.yaml get /frames/{frame_id}/context
Get frame context: accessibility text, tree nodes, and extracted URLs.
Falls back to OCR data for legacy frames without accessibility data.
# Get frame metadata
Source: https://docs.screenpipe.com/api-reference/frames/get-frame-metadata
/openapi.yaml get /frames/{frame_id}/metadata
Get frame metadata (timestamp) for deep link navigation. screenpipe://frame/123 → resolve to timestamp.
# Get frame OCR (deprecated)
Source: https://docs.screenpipe.com/api-reference/frames/get-frame-ocr-deprecated
/openapi.yaml get /frames/{frame_id}/ocr
Get frame text positions with bounding boxes for a specific frame.
Uses accessibility tree node bounds when available, and OCR fallback positions for visual-only or legacy frames.
Both OCR and accessibility bounds are normalized to 0-1 relative to the
monitor (full-screen capture), so they align correctly with the screenshot.
# Get frame text and bounds
Source: https://docs.screenpipe.com/api-reference/frames/get-frame-text-and-bounds
/openapi.yaml get /frames/{frame_id}/text
Get frame text positions with bounding boxes for a specific frame.
Uses accessibility tree node bounds when available, and OCR fallback positions for visual-only or legacy frames.
Both OCR and accessibility bounds are normalized to 0-1 relative to the
monitor (full-screen capture), so they align correctly with the screenshot.
# Get frame UI elements
Source: https://docs.screenpipe.com/api-reference/frames/get-frame-ui-elements
/openapi.yaml get /frames/{frame_id}/elements
Get all elements for a specific frame (full element tree).
# Get next valid frame
Source: https://docs.screenpipe.com/api-reference/frames/get-next-valid-frame
/openapi.yaml get /frames/next-valid
Find the next frame that has a valid video file on disk.
This allows the frontend to skip directly to a valid frame instead of
trying each frame one-by-one when frames fail to load.
# Run frame OCR (deprecated)
Source: https://docs.screenpipe.com/api-reference/frames/run-frame-ocr-deprecated
/openapi.yaml post /frames/{frame_id}/ocr
Run on-demand OCR on a frame that has no stored bounding boxes.
Loads the snapshot JPEG, runs Apple Vision OCR, stores the result,
and returns the text positions. Subsequent GET requests will hit the
cached DB row. If OCR data already exists, returns it without re-running.
# Run OCR on frame
Source: https://docs.screenpipe.com/api-reference/frames/run-ocr-on-frame
/openapi.yaml post /frames/{frame_id}/text
Run on-demand OCR on a frame that has no stored bounding boxes.
Loads the snapshot JPEG, runs Apple Vision OCR, stores the result,
and returns the text positions. Subsequent GET requests will hit the
cached DB row. If OCR data already exists, returns it without re-running.
# Bulk delete meetings
Source: https://docs.screenpipe.com/api-reference/meetings/bulk-delete-meetings
/openapi.yaml post /meetings/bulk-delete
# Delete meeting
Source: https://docs.screenpipe.com/api-reference/meetings/delete-meeting
/openapi.yaml delete /meetings/{id}
# Get meeting by ID
Source: https://docs.screenpipe.com/api-reference/meetings/get-meeting-by-id
/openapi.yaml get /meetings/{id}
# Get meeting detection status
Source: https://docs.screenpipe.com/api-reference/meetings/get-meeting-detection-status
/openapi.yaml get /meetings/status
# List meetings
Source: https://docs.screenpipe.com/api-reference/meetings/list-meetings
/openapi.yaml get /meetings
Returns detected and manually started meetings with transcriptions.
# Merge meetings
Source: https://docs.screenpipe.com/api-reference/meetings/merge-meetings
/openapi.yaml post /meetings/merge
# Start a manual meeting
Source: https://docs.screenpipe.com/api-reference/meetings/start-a-manual-meeting
/openapi.yaml post /meetings/start
# Stop a manual meeting
Source: https://docs.screenpipe.com/api-reference/meetings/stop-a-manual-meeting
/openapi.yaml post /meetings/stop
# Update meeting
Source: https://docs.screenpipe.com/api-reference/meetings/update-meeting
/openapi.yaml put /meetings/{id}
# Create memory
Source: https://docs.screenpipe.com/api-reference/memories/create-memory
/openapi.yaml post /memories
# Delete memory
Source: https://docs.screenpipe.com/api-reference/memories/delete-memory
/openapi.yaml delete /memories/{id}
# Get memory by ID
Source: https://docs.screenpipe.com/api-reference/memories/get-memory-by-id
/openapi.yaml get /memories/{id}
# List memories
Source: https://docs.screenpipe.com/api-reference/memories/list-memories
/openapi.yaml get /memories
Returns saved AI memories / knowledge extracted from screen activity.
# Update memory
Source: https://docs.screenpipe.com/api-reference/memories/update-memory
/openapi.yaml put /memories/{id}
# Keyword search
Source: https://docs.screenpipe.com/api-reference/search/keyword-search
/openapi.yaml get /search/keyword
Fast keyword-based search across all content types.
# Search screen and audio content
Source: https://docs.screenpipe.com/api-reference/search/search-screen-and-audio-content
/openapi.yaml get /search
Query captured screen text (accessibility-first with OCR fallback), audio transcriptions, and UI elements with filters for time range, app, window, content type, and more.
# Delete speaker
Source: https://docs.screenpipe.com/api-reference/speakers/delete-speaker
/openapi.yaml post /speakers/delete
# Find similar speakers
Source: https://docs.screenpipe.com/api-reference/speakers/find-similar-speakers
/openapi.yaml get /speakers/similar
# List unnamed speakers
Source: https://docs.screenpipe.com/api-reference/speakers/list-unnamed-speakers
/openapi.yaml get /speakers/unnamed
Returns speakers that haven't been identified/named yet.
# Mark speaker as hallucination
Source: https://docs.screenpipe.com/api-reference/speakers/mark-speaker-as-hallucination
/openapi.yaml post /speakers/hallucination
Flag a detected speaker as a false positive / hallucination.
# Merge speakers
Source: https://docs.screenpipe.com/api-reference/speakers/merge-speakers
/openapi.yaml post /speakers/merge
Merge two speaker identities into one.
# Reassign speaker
Source: https://docs.screenpipe.com/api-reference/speakers/reassign-speaker
/openapi.yaml post /speakers/reassign
Reassign audio segments from one speaker to another.
# Search speakers
Source: https://docs.screenpipe.com/api-reference/speakers/search-speakers
/openapi.yaml get /speakers/search
# Undo speaker reassignment
Source: https://docs.screenpipe.com/api-reference/speakers/undo-speaker-reassignment
/openapi.yaml post /speakers/undo-reassign
# Update speaker name
Source: https://docs.screenpipe.com/api-reference/speakers/update-speaker-name
/openapi.yaml post /speakers/update
# Health check
Source: https://docs.screenpipe.com/api-reference/system/health-check
/openapi.yaml get /health
Returns system health status including audio/video pipeline state, device info, and version.
**Public endpoint.** No API key is required. See [REST authentication exceptions](/rest-api/authentication).
* [Rate limits and credits](/rate-limits)
* [HTTP responses and status codes](/responses)
* [Errors and request IDs](/errors)
[Open the generated operation schema](/schemas/operations/health-check) for machine-readable request and response details.
# Add tags
Source: https://docs.screenpipe.com/api-reference/tags/add-tags
/openapi.yaml post /tags/{content_type}/{id}
Add tags to a specific content item (frame or audio chunk).
# Get tags in batch
Source: https://docs.screenpipe.com/api-reference/tags/get-tags-in-batch
/openapi.yaml post /tags/vision/batch
Batch fetch tags for multiple vision frame IDs.
POST /tags/vision/batch { "frame_ids": [1, 2, 3] }
# Remove tags
Source: https://docs.screenpipe.com/api-reference/tags/remove-tags
/openapi.yaml delete /tags/{content_type}/{id}
Remove tags from a specific content item.
# Get vault status
Source: https://docs.screenpipe.com/api-reference/vault/get-vault-status
/openapi.yaml get /vault/status
GET /vault/status
# Lock vault
Source: https://docs.screenpipe.com/api-reference/vault/lock-vault
/openapi.yaml post /vault/lock
POST /vault/lock
# Set up vault
Source: https://docs.screenpipe.com/api-reference/vault/set-up-vault
/openapi.yaml post /vault/setup
POST /vault/setup
# Unlock vault
Source: https://docs.screenpipe.com/api-reference/vault/unlock-vault
/openapi.yaml post /vault/unlock
POST /vault/unlock
# List monitors
Source: https://docs.screenpipe.com/api-reference/vision/list-monitors
/openapi.yaml get /vision/list
Returns all available monitors/displays.
# screenpipe architecture: event-driven capture and storage
Source: https://docs.screenpipe.com/architecture
How screenpipe uses event-driven capture, accessibility tree extraction, OCR fallback, and SQLite storage to build a searchable local memory of your screen.
## overview
screenpipe is a Rust application that captures your screen and audio using an event-driven architecture, processes them locally, and stores everything in a SQLite database. instead of recording every second, it listens for meaningful OS events and captures only when something actually changes — pairing each screenshot with accessibility tree data for maximum quality at minimal cost.
```mermaid theme={null}
graph LR
subgraph trigger["event triggers"]
E1[app switch]
E2[click / scroll]
E3[typing pause]
E4[idle timer]
end
subgraph capture["paired capture"]
SS[screenshot]
A11Y[accessibility tree]
OCR[OCR fallback]
end
subgraph audio["audio"]
MIC[microphone]
SYS[system audio]
STT[speech-to-text]
end
subgraph store["storage"]
DB[(SQLite)]
FS[JPEG files]
end
subgraph serve["API · localhost:3030"]
REST[REST API]
MCP[MCP server]
end
E1 & E2 & E3 & E4 --> SS
SS --> A11Y
A11Y -->|empty?| OCR
A11Y --> DB
OCR --> DB
SS --> FS
MIC & SYS --> STT --> DB
DB --> REST
DB --> MCP
FS --> REST
REST --> P[pipes / AI agents]
MCP --> AI[Claude · Cursor · etc.]
```
## data flow
```mermaid theme={null}
sequenceDiagram
participant OS as OS Events
participant Capture
participant A11Y as Accessibility
participant OCR as OCR (fallback)
participant Audio
participant SQLite
participant API
participant AI
OS->>Capture: meaningful event (click, app switch, typing pause...)
Capture->>Capture: screenshot
Capture->>A11Y: walk accessibility tree
alt accessibility data available
A11Y->>SQLite: structured text + metadata
else accessibility empty (remote desktop, games)
A11Y->>OCR: fallback
OCR->>SQLite: extracted text + metadata
end
Capture->>SQLite: JPEG frame
loop every 30s chunk
Audio->>SQLite: transcription + speaker
Audio->>SQLite: audio file
end
AI->>API: search query
API->>SQLite: SQL lookup
SQLite-->>API: results
API-->>AI: JSON response
```
## crates
screenpipe is a Rust workspace with specialized crates:
```mermaid theme={null}
graph TD
APP[screenpipe-app-tauridesktop app ]
SERVER[screenpipe-serverREST API · routes ]
DB[screenpipe-dbSQLite · types ]
VISION[screenpipe-visionscreen capture · OCR fallback ]
AUDIO[screenpipe-audioaudio capture · STT ]
CORE[screenpipe-corepipes · config ]
EVENTS[screenpipe-eventsevent system ]
A11Y[screenpipe-accessibilityUI events · accessibility tree ]
INT[screenpipe-integrationsMCP · reminders ]
APP --> SERVER
SERVER --> DB
SERVER --> VISION
SERVER --> AUDIO
SERVER --> CORE
SERVER --> EVENTS
AUDIO --> DB
VISION --> DB
CORE --> DB
A11Y --> DB
INT --> SERVER
```
## layers
### 1. event-driven capture
screenpipe listens for meaningful OS events instead of polling at a fixed FPS. when an event fires, it captures a screenshot and walks the accessibility tree together — same timestamp, same frame.
| trigger | description |
| ------------------ | ----------------------------------------------------- |
| **app switch** | user switched to a different application |
| **window focus** | a new window gained focus |
| **click / scroll** | user interacted with the UI |
| **typing pause** | user stopped typing (debounced) |
| **clipboard copy** | content copied to clipboard |
| **idle fallback** | periodic capture every \~5s when nothing is happening |
| what | how | crate |
| ------------------- | -------------------------------------------------------------------------- | -------------------------- |
| **screen** | event-triggered screenshot of the active monitor | `screenpipe-vision` |
| **text extraction** | accessibility tree walk (structured text: buttons, labels, fields) | `screenpipe-accessibility` |
| **OCR fallback** | when accessibility data is empty (remote desktops, games, some Linux apps) | `screenpipe-vision` |
| **audio** | multiple input/output devices in configurable chunks (default 30s) | `screenpipe-audio` |
### 2. processing
| engine | type | platform | when used |
| ------------------ | --------------- | -------------------- | -------------------------------------- |
| accessibility tree | text extraction | macOS, Windows | primary — used for every capture |
| Apple Vision | OCR | macOS | fallback when accessibility is empty |
| Windows native | OCR | Windows | fallback when accessibility is empty |
| Tesseract | OCR | Linux | primary (accessibility support varies) |
| Whisper | speech-to-text | local, all platforms | audio transcription |
| Deepgram | speech-to-text | cloud API | optional cloud audio |
additional processing: speaker identification, PII redaction, frame deduplication (skips identical frames).
### 3. storage
all data stays local on your machine:
* **SQLite** at `~/.screenpipe/db.sqlite` — metadata, accessibility text, OCR fallback text, transcriptions, speakers, tags, UI elements
* **media** at `~/.screenpipe/data/` — JPEG screenshots (event-driven frames), audio chunks
### 4. API
REST API on `localhost:3030`:
| endpoint | description |
| ---------------------- | ---------------------------------------------------------------------- |
| `/search` | filtered content retrieval (accessibility, OCR fallback, audio, input) |
| `/search/keyword` | keyword search with text positions |
| `/elements` | lightweight UI element search (accessibility tree data) |
| `/frames/{id}` | access captured frames |
| `/frames/{id}/context` | accessibility text + URLs + OCR fallback for a frame |
| `/health` | system status and metrics |
| `/raw_sql` | direct database queries |
see [API reference](/cli-reference) for the full endpoint list.
### 5. pipes
[pipes](/pipes) are AI agents (`.md` prompt files) that run on your screen data. they're executed by an AI agent that reads the prompt, queries the screenpipe API, and takes action.
pipes live in `~/.screenpipe/pipes/{name}/` and run on cron-like schedules.
### 6. desktop app
the desktop app is built with **Tauri** (Rust backend) + **Next.js** (React frontend):
```mermaid theme={null}
graph LR
subgraph tauri["Tauri shell"]
RS[Rust backend commands · permissions · tray]
WV[WebView]
end
subgraph frontend["Next.js frontend"]
PAGES[pages chat · timeline · settings]
STORE[Zustand stores]
UI[shadcn/ui components]
end
subgraph backend["screenpipe-server"]
API[REST API :3030]
end
RS --> WV
WV --> PAGES
PAGES --> STORE
STORE --> UI
PAGES --> API
```
## database schema
key tables:
| table | stores |
| ---------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `frames` | captured screen frame metadata (includes `snapshot_path`, `accessibility_text`, `capture_trigger`) plus screen text on `full_text` (accessibility text, with OCR as fallback) |
| `elements` | UI elements from accessibility tree (buttons, labels, text fields) with FTS5 search |
| `audio_chunks` | audio recording metadata |
| `audio_transcriptions` | text from audio |
| `speakers` | identified speakers |
| `ui_events` | keyboard, mouse, clipboard events |
| `tags` | user-applied tags on content |
inspect directly:
```bash theme={null}
sqlite3 ~/.screenpipe/db.sqlite .schema
```
## resource usage
runs 24/7 on a MacBook Pro M3 (32 GB) or a \$400 Windows laptop:
| metric | typical value |
| ------- | -------------------------------------------------------------------------------- |
| RAM | \~600 MB |
| CPU | \~5-10% |
| storage | \~5-10 GB/month (event-driven capture only stores frames when something changes) |
## source code
| component | path |
| -------------- | ------------------------------------------------------------------------------------------------------------------------ |
| API server | [screenpipe-server/src/](https://github.com/screenpipe/screenpipe/tree/main/crates/screenpipe-server/src) |
| screen capture | [screenpipe-vision/src/core.rs](https://github.com/screenpipe/screenpipe/blob/main/crates/screenpipe-vision/src/core.rs) |
| audio capture | [screenpipe-audio/src/](https://github.com/screenpipe/screenpipe/tree/main/crates/screenpipe-audio/src) |
| database | [screenpipe-db/src/db.rs](https://github.com/screenpipe/screenpipe/blob/main/crates/screenpipe-db/src/db.rs) |
| pipes | [screenpipe-core/src/pipes/](https://github.com/screenpipe/screenpipe/tree/main/crates/screenpipe-core/src/pipes) |
| MCP server | [screenpipe-mcp/src/index.ts](https://github.com/screenpipe/screenpipe/blob/main/packages/screenpipe-mcp/src/index.ts) |
| desktop app | [screenpipe-app-tauri/](https://github.com/screenpipe/screenpipe/tree/main/apps/screenpipe-app-tauri) |
# screenpipe changelog: releases, features, and fixes
Source: https://docs.screenpipe.com/changelog
Track every screenpipe release: new features, performance improvements, bug fixes, and breaking changes across desktop and CLI versions.
## week of august 3, 2026
### updates
* **See your AI usage in Settings** — the Usage tab in app settings now shows how much of your AI allowance you've used, with a per-lane progress bar for auto and manual model traffic (or a single "all models" bar when your plan doesn't split them). Each meter includes your plan label, the window type, the next reset time, and turns yellow under 30% remaining and red when exhausted, with an upgrade link when one applies. See [connections](/connections).
## week of july 28, 2026
### new features
* **One-hour follow-up on your first Live View** — after you finish onboarding and open your first Live View, screenpipe now checks back in about an hour later with a lightweight nudge to revisit that same Live View. The follow-up is scoped to the specific Live View you just set up (not a generic prompt), so you're pointed straight at the dashboard that's now had time to accumulate real, source-backed results. See [second brain](/second-brain) and [getting started](/getting-started).
* **Canvas mode for Live Views** — Brain dashboards now have a durable **Canvas** view alongside the grid Dashboard. Arrange live, source-backed cards on a whiteboard, connect them into a process map, add editable notes, connectors, and freehand strokes, then pan, zoom, fit, or auto-arrange. Canvas layout is saved per Live View, survives clones, and is cleaned up when a Live View is deleted. On macOS, trackpad pinch now zooms around the pointer. See [second brain](/second-brain).
* **Daily summaries in Timeline** — the Timeline day view can now generate a source-backed summary of the selected day on demand, using your configured AI provider and the existing Enhanced AI consent. Generation only runs when you click, results are cached locally, and the summary stays scoped to the selected local calendar day. See [meeting intelligence](/meeting-intelligence) and [ai memory](/ai-memory).
* **Thumbs up / thumbs down on chat responses** — completed assistant replies now show quick thumbs-up and thumbs-down actions in the message row. Ratings are keyboard- and screen-reader-accessible, and the feedback signal is content-free — no prompts, replies, titles, IDs, or filenames are sent. See [ai memory](/ai-memory).
* **Enterprise write-only archive with a customer-run query gateway** — enterprise devices can now stream telemetry directly to a customer-owned S3 / MinIO / R2 bucket using write-only credentials, with an optional MDM-pinned destination allow-list that blocks uploads to anywhere else before the first byte leaves the device. A new self-hosted gateway container ingests those objects into a local SQLite + FTS5 store and serves the v1-compatible REST and MCP APIs on the customer's own network, protected by offline-verifiable `sk_ent_` tokens. The `screenpipe-mcp` `team-*` tools accept a base-URL override so agents can point at the customer gateway instead of the hosted service. See [teams](/teams) and [cloud archive](/cloud-archive).
### updates
* **Enhanced incognito detection is now opt-in** — **Ignore Incognito Windows** stays on by default but now uses a lightweight focused-window check instead of walking the full accessibility tree every second. Browser-native detection (which requires macOS Automation permission per browser) is now a separate **Enhance** action inside the same setting, and only prompts for browsers that are installed and currently open. New CLI flags: `screenpipe record --ignore-incognito-windows=false` to record incognito windows, and `screenpipe record --enhanced-incognito-detection` to opt into browser-native detection. See [privacy filter](/privacy-filter) and [permissions](/permissions).
* **Fixed-period dashboards drop the misleading time picker** — Live View dashboards that own a fixed period (like "yesterday's memory" or a 24-hour standup) no longer show a disabled time selector. The active period is described in plain text instead, and screenpipe infers fixed vs. selectable automatically for AI-created dashboards so you never have to configure it. Switching between dashboards also stays responsive while a refresh is running. See [second brain](/second-brain).
* **"Remember and resume my work" is the default focus for existing users** — users who never picked a focus during onboarding now default to **remember and resume my work** the next time General Settings loads. Any explicit saved choice, including **No specific goal**, is left alone. See [getting started](/getting-started).
### bug fixes
* **Meeting summaries no longer export full meeting videos** — a routine "summarize this meeting" request could silently ignore your selected summary pipe and fall through to a prompt that exported the full meeting MP4 before using just a couple of frames. Screenpipe now reads the canonical pipe body, the built-in and bundled meeting-summary prompts stay on the transcript plus a bounded number of existing frame IDs, and full video export is explicitly blocked unless you ask for it. See [meeting intelligence](/meeting-intelligence) and [pipes](/pipes).
* **Telegram credentials stay server-side** — sending a message to Telegram through the AI agent now goes through a local `POST /connections/telegram/send` endpoint, so the bot token and chat ID never appear in rendered agent context. See [connections](/connections) and [privacy data flow](/privacy-data-flow).
* **Automatic recovery from stuck database shutdowns** — if screenpipe hit a rare SQLite hard-fault while compacting and the safe-shutdown step then stalled, recording and the local API could stay down until you manually relaunched the app. Screenpipe now closes its read and write pools together, caps confirmed hard-fault shutdown at 15 seconds, and automatically relaunches the app if it can't prove all old database connections were released. See [troubleshooting](/troubleshooting).
* **Windows: no more crashes during frame comparison** — on some Windows machines, screenpipe could hit an allocation fault while comparing frames and exit the recording worker. The frame-comparison path now uses a much smaller working buffer, safely skips a single comparison under memory pressure instead of aborting, and preserves the existing color-sensitive early-exit behavior. See [troubleshooting](/troubleshooting).
## week of july 27, 2026
### new features
* **Brain dashboards with pipe-powered Live Views** — the Home window now opens into **Brain**, a personal dashboard built from source-backed cards. Pick an outcome during onboarding (resume your work, follow through after meetings, understand how you work, or turn repeated work into a process) and screenpipe installs one or two matching pipes and creates a named dashboard for you. Nothing shows up until a real, source-backed result exists — no fake sample cards — and once it does, you can drag, resize, refresh, regenerate, or rate any card, or spin up a new dashboard from natural language. Existing users get a new **My dashboard** the first time Brain opens with no saved views. See [second brain](/second-brain), [pipes](/pipes), and [getting started](/getting-started).
* **Google Calendar and Gmail in onboarding** — the optional connections step now offers **Google Calendar** (read-only, via screenpipe's own OAuth) and **Gmail** (managed authorization via Composio) in place of Notion and ChatGPT, so calendar and email context are wired up before you finish setup. Obsidian and detected local AI tools remain in the same step. See [connections](/connections) and [getting started](/getting-started).
### updates
* **HTML artifacts open rendered by default** — HTML artifacts now open as rendered pages instead of raw source, so a snippet like `report ` shows the heading immediately in both the artifact viewer and Brain rows. Raw HTML is still one click away behind **view source**, and the same sandboxed iframe and CSP apply — empty or truncated files never render. See [pipes](/pipes).
* **consistent Live View time range on every macOS version** — the Live View time-range picker now uses screenpipe's own selector instead of the native `` control, so it looks and behaves the same on macOS 15 and macOS 26. Time-range persistence and the exact window sent to connected pipes are unchanged. See [second brain](/second-brain).
### bug fixes
* **Brain opens to a real dashboard on first run** — opening Brain with no saved Live Views used to leave you on an empty AI prompt with no dashboard shell. Screenpipe now creates and persists a usable **My dashboard** on first open, and the first row of Brain content on Windows no longer slides under the 32 px draggable title bar. Narrow windows also get tighter horizontal padding without changing the desktop layout. See [second brain](/second-brain).
* **Artifacts tab no longer shows internal Live View state** — Live View records that were stored as JSON for card refresh, revision history, and ratings used to leak into the **Artifacts** tab next to your real files. That internal state is now hidden from the default artifacts list (search, filters, pagination, and totals all skip it) while remaining available to the CLI and API for anything that explicitly opts in. See [pipes](/pipes).
## week of july 20, 2026
### new features
* **simpler onboarding with one-click app connections** — the setup flow has a redesigned Connect apps step that scans your machine for installed AI tools — Claude Desktop, Cursor, Codex, Windsurf, ChatGPT, Obsidian, Openclaw, Hermes, and more — and lets you wire each one to screenpipe with a single click. Detected tools are surfaced first so you're not scrolling past apps you don't use, a "connect all" button turns on every detected tool at once, and Obsidian auto-picks your first discovered vault (you can change it later in Settings → Connections). If a connection fails, the card now shows a clear, human-readable error instead of a raw stack trace. See [connections](/connections) and [getting started](/getting-started).\n- **exclude apps from system-audio capture (macOS 14.4+)** — you can now keep specific apps out of screenpipe's system-audio recording. Open Settings → Recording → "Exclude apps from system audio," pick any `.app` with the Finder picker, and the app appears as a chip in the exclusion list with its icon. Apply & Restart wires the exclusions into the audio engine, and the underlying `~/.screenpipe/audio-exclusions.json` file hot-reloads so edits take effect without a manual restart. macOS will prompt once for the new `NSAudioCaptureUsageDescription` permission the first time an exclusion is applied. See [meeting transcription](/meeting-transcription) and [permissions](/permissions).
* **exclude apps from system-audio capture (Windows)** — the per-app audio exclusion feature now works on Windows too. Add apps to your exclusion list and screenpipe will drop their audio from system-audio recordings, matching the macOS behavior. Edits to the exclusion file take effect live without restarting capture, and hand-edits saved from Notepad (which adds a UTF-8 BOM) are handled correctly. The Windows capture path was also tuned to keep exclusion checks off the time-critical audio thread, eliminating the receive gaps and audio discontinuities that could otherwise show up while an exclusion was active. See [meeting transcription](/meeting-transcription).
* **bring your own MCP servers** — you can now register custom MCP servers in your screenpipe config and route them through the built-in AI agent alongside screenpipe's own MCP tools. Existing setups (including Hermes) are picked up automatically, so tools you've already wired up keep working without reconfiguration. See [MCP server](/mcp-server) and [connections](/connections).
* **cleaner microphone capture with VoiceProcessingIO (Apple silicon)** — microphone recording can now opt into macOS VoiceProcessingIO for hardware-assisted echo cancellation and noise suppression on Apple silicon Macs, producing noticeably cleaner input for meetings and dictation. Off by default; enable it in audio settings when you want the extra processing. See [meeting transcription](/meeting-transcription).
### updates
* **CLI auto-connects every detected AI tool on startup** — when the screenpipe CLI starts, it now scans for every supported AI coding tool installed on your machine (Claude Code, Cursor, Cline, Continue, Copilot CLI, Gemini CLI, opencode, and more) and wires them up to screenpipe over MCP in one shot, instead of asking you to connect each one by hand. Existing custom MCP servers you've already configured (including Hermes) are preserved untouched, so previously wired-up tools keep their settings. See [MCP server](/mcp-server) and [connections](/connections).
* **screenpipe cloud AI catalog cleaned up and modernized** — the hosted chat gateway and desktop model picker no longer list retired options (Google Open MaaS, Gemini 3, selectable Gemma 4, GPT‑OSS/OpenRouter‑era choices, Claude Haiku, and older Sonnet families). Saved presets that pointed at any of those IDs are now transparently upgraded: hosted Claude legacy IDs move to GPT‑5.6 Luna, and direct Anthropic BYOK legacy IDs move to Claude Sonnet 5. Paid Auto and outage fallback now flow through Luna → Sonnet 5 → GPT‑5.4 mini (the free preview stays bounded to Luna → GPT‑5.4 mini). Existing chats and pipes keep working — you'll just be routed to a current model instead of a decommissioned one. See [connections](/connections).
### bug fixes
* **Electron apps get the full accessibility walk** — VS Code, Discord, Slack, and other Electron apps sometimes had their content indexing cut off partway through the accessibility tree, so screen text from those apps could be missing from search results. The depth counter now resets at `AXWebArea` boundaries, giving Electron apps the full walk budget and restoring complete text capture. See [search screen history](/search-screen-history).
* **USB audio devices no longer drop into silence on macOS** — USB microphones and interfaces whose native sample rate did not match the system's could silently stop delivering audio mid-session on macOS. Sample-rate mismatches are now handled correctly, so USB capture keeps flowing throughout the recording. See [troubleshooting](/troubleshooting).
* **free AI chat accepts one verbose tool** — the free AI chat gateway previously rejected requests containing a single tool with a long description or a large parameter schema. The size cap now applies to the combined byte size of all tool definitions in a request instead of each tool individually, so one verbose tool goes through as long as the aggregate stays under the limit. Pi and pipes that ship a rich schema for a single tool no longer see spurious `free_chat_tools_too_large` errors. See [pipes](/pipes).
## week of july 17, 2026
### bug fixes
* **cleaner pipe sidebar after onboarding** — pipes you added manually (not from the pipe store) no longer clutter the sidebar list, and the pipes section now auto-expands the first time you finish onboarding so your newly installed pipes are visible instead of hidden behind a collapsed group. See [pipe store](/pipe-store).
* **streaming capture keeps running over RDP** — the SDK's streaming capture path could stop delivering frames when the desktop app was accessed over a Remote Desktop (RDP) session, because RDP swaps the active session's graphics stack out from under the capture stream. Streaming now survives the session transition and keeps producing frames while you're connected over RDP. See [for developers](/for-developers).
## week of july 13, 2026
### updates
* **faster, broader browser URL detection** — capturing the URL of the active browser tab no longer shells out to AppleScript on every walk of the accessibility tree. screenpipe now reads the URL directly from the browser's web area, dropping per-check cost from \~150–200 ms to \~2 ms and cutting background CPU during recording. The new path also covers every Chromium-family browser (Chrome, Edge, Brave, Vivaldi, Opera, Arc) and Electron apps, not just Arc. Non-web schemes like `chrome://` and `arc://` are filtered out so they no longer pollute your browsing history. See [search screen history](/search-screen-history).
### bug fixes
* **auto-update no longer gets stuck in a restart loop** — applying an update from the tray or the in-app banner used to be able to fire twice, so the app would tear down and relaunch in parallel and the health watchdog would respawn the server mid-restart. Restart-to-update now runs exactly once regardless of how it's triggered, so updates finish cleanly on the first try. See [getting started](/getting-started).
* **pipe sidebar now shows exact run counts** — the run count next to each pipe in the sidebar now reflects the true number of executions stored locally, not just the recent chat sessions loaded in memory. Older runs load 10 at a time as you scroll, so opening a long-running pipe like `digital-clone` now shows its real history instead of an undercount. See [pipe store](/pipe-store).
## week of july 6, 2026
### new features
* **meeting piggyback: capture the app's audio and the right mic (experimental)** — turn on **meeting piggyback (experimental)** in **settings → recording** and, when screenpipe detects a meeting, capture follows the meeting: the app's own audio via a per-process tap (no music or notification bleed from the rest of your system) plus the mic the meeting app actually opened (right device even when it isn't your OS default). Any failure — unsupported OS, mic loss, tap death — falls back to your normal capture with no gap. Off by default; macOS 14.4+ only for now (Windows toggle is visible but currently defers to the stable path until the loopback supervisor ships). See [meeting transcription](/meeting-transcription).
* **mic capture-health notifications** — screenpipe now watches for the case where the meeting app is clearly recording but your mic is delivering pure silence, silently restarts the stream first, and only notifies you if the problem persists (≥2 min of app-active silence, at most one alert every 30 min, never for muted mics). See [meeting transcription](/meeting-transcription).
* **batch select and delete for pipes** — each pipe's three-dot menu now has a **select** option that swaps the search bar for a selection toolbar (select all, count, delete, close). Confirm once to clean up several pipes at a time instead of deleting them one by one. See [pipe store](/pipe-store).
* **pill-based attendee editor for meeting notes** — attendees on a meeting note are now editable pills — add, remove, or edit each participant inline instead of retyping the whole list. See [meeting intelligence](/meeting-intelligence).
* **macOS quit confirmation** — quitting the app on macOS (⌘Q or menu **Quit**) now asks to confirm so recording sessions and unsynced work aren't ended by accident.
### updates
* **cleaner pipe cards** — install, run, and configure actions on each pipe card now appear on hover, so the store and installed lists stay tidy while everything is one hover away. See [pipe store](/pipe-store).
* **screen recording permission is now requested last** — on macOS, onboarding and permission recovery ask for microphone and accessibility first and screen recording last, so an early screen-recording prompt no longer relaunches the app before the rest of setup completes. See [permissions](/permissions).
* **faster searches over redacted history** — search and privacy-filter queries over long histories run noticeably quicker thanks to new database indexes and periodic optimization on the local store. No settings to change. See [privacy filter](/privacy-filter).
* **Windows: recording yields to your foreground app** — background capture and indexing on Windows now run at a lower priority than whatever app you're using, so screenpipe stays out of the way during heavy work while still recording continuously.
### bug fixes
* **fixed multi-GB memory leak in audio recording** — long recording sessions no longer balloon in memory usage. Speaker diarization now reuses a cached segmentation model instead of reloading it per chunk, and the speaker cluster store is bounded so it can't grow without limit. Expect noticeably lower RAM after extended meetings and all-day capture. See [meeting transcription](/meeting-transcription).
* **capture writes preserved during database contention** — the recorder no longer drops frames or transcript rows when the local database is briefly busy; writes are retried instead of silently discarded, so long sessions end up with complete history.
* **no more duplicate Automate My Work pipes** — installing or triggering an Automate My Work pipe twice no longer creates a second copy in your library. See [pipe store](/pipe-store).
* **no more duplicate or mis-titled chats across windows** — opening chat in multiple windows no longer creates duplicate sessions or shows the wrong title on either side; each window stays in sync with the correct conversation.
* **shortcut settings no longer crash the app** — a missing shortcut list on older installs is now backfilled on launch instead of throwing and breaking the whole window.
* **audio recovery on slow boot** — after granting microphone permission on a slow-booting Mac, screenpipe now waits for capture to finish coming up instead of giving up and staying silent until the next restart.
* **fewer false "audio stalled" errors after meetings** — the health check no longer flags a stall or returns a 503 while screenpipe is catching up on transcription right after a long meeting.
* **shared mic sample rate no longer forced** — devices that don't support screenpipe's preferred sample rate now negotiate their own, which fixes silent or distorted mic capture on some external interfaces, especially with meeting piggyback enabled. See [meeting transcription](/meeting-transcription).
## week of june 29, 2026
### new features
* **↑ / ↓ to recall recent chat messages** — pressing the up arrow in an empty chat input now cycles back through your recent messages (down to move forward), so you can re-send or tweak a previous prompt without retyping. Works across pipe chats and the main chat surface.
* **opt-in secret scrubbing for pi agent logs** — pi agent session logs can now be scrubbed of secrets by a background worker before they're shared or stored. Off by default; toggle it on in **settings → privacy** or via the CLI. See [privacy filter](/privacy-filter).
* **actionable notification inbox** — the bell in the top bar is now a persistent inbox: notifications stick around after you close the popover, and each one can carry actions you run inline (including a new `chat` action that runs a prompt without needing a pipe). See [home](/home).
* **pause recording per display from the dot popover** — click the recording dot in the menu bar to pause or resume screen capture for a specific monitor without stopping the others. Handy when you want to keep recording a work display while muting a personal one. See [permissions](/permissions).
* **feedback shares settings + PII-redacted logs** — the in-app **Send feedback** flow now bundles your current settings and runs shared logs through the cloud PII model before upload, so support gets enough context to reproduce issues without you scrubbing files by hand. See [troubleshooting](/troubleshooting).
* **enterprise: remote-trigger device log collection** — admins can now request logs from an enrolled device on demand; the always-on background loop picks up the request and uploads without user action. See [intune deployment](/intune-deployment).
* **opt-in software echo cancellation for the mic** — turn on software AEC (WebRTC AEC3) to strip speaker echo from your microphone during meetings and recordings, so transcripts and voice input stay clean even without a headset. Off by default; enable it in **settings → audio** or via the CLI. See [meeting transcription](/meeting-transcription).
* **smarter meeting-start detection (macOS + Windows)** — screenpipe now notices a meeting the moment your mic goes live and attributes it to the app or website holding it (Zoom, Meet, Teams, browser calls, and more), so meeting capture starts on time without relying on calendar entries or window titles. See [meeting intelligence](/meeting-intelligence).
* **Zendesk connector: OAuth fallback guidance** — the Zendesk connect flow now walks you through the manual OAuth fallback when the standard flow can't complete, so tenants with stricter admin policies can still finish setup. See [connections](/connections).
* **browse and manage Pi agent extensions from settings** — a new **Pi extensions** card in **settings → connections** lists every available extension with a description and one-click install / update / uninstall — no manual CLI needed to add capabilities to the bundled Pi agent. See [connections](/connections).
* **full agent trajectory saved for every pipe run** — each pipe run's complete event stream (assistant turns, tool calls, tool results) is now persisted to disk as JSONL, so you can export runs for evals, fine-tuning, or postmortems. Retention keeps the newest 50 runs per pipe by default. See [pipes](/pipes).
* **higher-fidelity action capture for search and agents** — coalesced scroll capture is now on by default (one row per gesture instead of \~60-120 rows per second), captured clicks include the ancestor path of the element you interacted with, and screen captures now snapshot the full display layout. Cleaner data for search, memory, and pipe agents with no user-visible overhead. See [search screen history](/search-screen-history).
* **retention defaults tightened** — new desktop installs enable local retention out of the box (14 days for media), so first-run disk usage stays bounded without needing to open settings. The CLI keeps data forever by default (retention off) unless you pass `--retention-days`, so headless deployments never delete data by accident. Existing installs are unaffected. See the [CLI reference](/cli-reference) and [privacy data flow](/privacy-data-flow).
* **enterprise: managed screenshot capture controls** — admins can now lock screenshot capture behavior (frequency, per-monitor selection, disabled state) through managed settings, so recording policy is enforced consistently across a fleet. See [intune deployment](/intune-deployment).
* **enterprise: telemetry tagged by org and device** — telemetry events from enrolled devices now carry the organization ID and a stable device identifier, so admins can slice usage and health by team or device. See [intune deployment](/intune-deployment).
* **`SCREENPIPE_SKIP_ONBOARDING` env-var escape hatch** — set `SCREENPIPE_SKIP_ONBOARDING=1` to boot straight into the main view. Useful for corp VDI, headless containers, MDM-preseeded deploys, and any environment where interactive onboarding can't complete. Off by default; onboarding can still be reopened from settings. See [getting started](/getting-started).
* **pipe sessions collapse into a single group in the sidebar** — the chat sidebar now folds every session for the same pipe under one **Pipes** group instead of scattering them across recents, so the list stays short even after a busy week. See [pipes](/pipes).
### updates
* **trigger setup opens the exact connection dialog you need** — when a pipe trigger requires a connection that isn't set up yet, the **Connect** CTA now opens the specific connection dialog (Slack, Notion, Obsidian, …) directly instead of dropping you on the connections list. See [pipes](/pipes) and [connections](/connections).
* **friendlier onboarding errors when a connect step fails** — the connect-step failure copy on first run has been rewritten for non-technical users, with clearer language about what went wrong and what to try next. See [getting started](/getting-started).
* **OpenRouter removed from the AI gateway** — the last bit of background traffic that ran through OpenRouter (Qwen3.5) is now routed to GLM-5 directly. No action needed; behavior is unchanged for end users.
* **storage tabs and backend sync removed from settings** — the storage archive and backend sync tabs are gone, along with their duplicative controls. Retention and cloud archive continue to live in **settings → storage**, and cloud archive is unchanged. See [cloud archive](/cloud-archive).
* **snapshot compaction setting hidden** — the low-level snapshot compaction toggle has been removed from **settings → recording** now that compaction runs reliably in the background. Disk usage still follows your retention settings; nothing to configure. See [search screen history](/search-screen-history).
* **timeline hides audio-only markers while browsing** — when you're navigating the visual timeline, markers for audio-only segments no longer clutter the strip, so the frame view stays focused on the screenshot ranges you're scrubbing through. See [search screen history](/search-screen-history).
* **search input no longer autocorrects your query** — the search box no longer runs OS-level autocorrect or autocapitalize, so exact-match terms (usernames, code, paths) go through untouched.
* **feedback attachment window is now bounded** — the **Send feedback** flow now attaches a bounded recent-recording window instead of the last unbounded slice, so submissions upload faster and don't include unrelated older data. See [troubleshooting](/troubleshooting).
* **lower background CPU from the resource monitor** — the app-health / resource-monitor loop now wakes far less often and coalesces its samples, cutting idle background CPU on all platforms.
* **no more surprise app relaunch after a DB blip** — a transient database error no longer triggers an automatic full-app relaunch. The engine now recovers in place; a manual restart is only prompted when something genuinely wedged.
* **chat hides "thinking" blocks and merges work into one rail** — reasoning-model thinking blocks are now always hidden (the toggle is gone), and per-tool "work" groups collapse into a single rail with a time-to-thought duration instead of a wall of intermediate narration. Groups stay open while the model is working and auto-collapse when the turn ends.
* **settings back button returns to the previous page** — the back button in **settings** used to always jump home; it now walks you back through the pages you actually visited.
### bug fixes
* **search filters no longer get stuck on stale state** — the filter chips at the top of the search page could keep showing a previous filter's UI state after you cleared or switched filters, so the visible chips and the actual query disagreed. Filter UI state is now reset cleanly on every change. See [search screen history](/search-screen-history).
* **untitled calendar events stay untitled** — events with no title used to default to a literal "(no title)" string, which leaked into summaries, prompts, and notifications. Untitled events now render as empty. The recording-prewarm toast that could fire twice on the same event is also deduped. See [meeting intelligence](/meeting-intelligence).
* **timeline scrolls smoothly with a trackpad** — two-finger trackpad scrolling on the timeline used to jump or skip frames instead of navigating continuously. Trackpad scroll now navigates the timeline cleanly. See [search screen history](/search-screen-history).
* **permission monitor doesn't false-alarm on screen unlock or display change** — unlocking your Mac or plugging/unplugging a display could briefly read system permissions as "revoked" and pop a misleading permission-lost warning. The monitor now graces these transitions, so transient OS state never trips a false alert. See [permissions](/permissions).
* **menu-bar menu opens on the first click (macOS)** — the macOS tray menu used to flash open then immediately close on the first click after launch, requiring a second click to actually use it. First-click open now works.
* **audio reconciliation no longer loops on dedup collisions** — a rare race in audio dedup could leave the reconciliation loop retrying forever on a UNIQUE-constraint collision, spiking CPU. The loop now exits cleanly on the collision. See [meeting transcription](/meeting-transcription).
* **app refocuses correctly after the macOS permission grant** — granting screen-recording permission during onboarding used to leave the app behind other windows with no way to bring it forward. The app now reliably shows, unminimizes, and refocuses after the system grant, so onboarding continues without a manual switch. See [getting started](/getting-started).
* **opening the bell no longer marks every notification read** — clicking the notification bell used to instantly mark the entire inbox as read, so unread counts vanished the moment you peeked. Notifications now stay unread until you actually open or act on them. See [home](/home).
* **search results grid reflows to fit the window** — resizing the app used to leave gaps or clip the last column on the search page. The results grid now auto-fills the container and reflows cleanly at every width. See [search screen history](/search-screen-history).
* **Arch Linux AppImage launches again** — bundled `libavif` / `libsharpyuv` conflicted with system libraries on Arch, preventing the AppImage from starting. The conflicting bundled copies are now stripped and Arch is covered by a launch smoke test.
* **enterprise: Windows updater falls back cleanly** — a failed update on Windows in the enterprise build could leave the app stuck instead of retrying through the fallback path. The fallback now runs as designed and the app updates on the next attempt.
* **redacted OCR words no longer leak through per-word text** — after PII redaction, the per-word OCR data served by the text-overlay endpoints still held the raw recognized words, making redacted text reconstructible. Words are now scrubbed alongside the main OCR text while bounding-box geometry stays intact. See [privacy filter](/privacy-filter).
* **pipes stop retrying quota errors as rate limits** — pipes that hit a real quota or billing cap used to be retried as if they were transient rate limits, wasting time and sometimes masking the actual failure. Terminal quota errors now surface immediately, while genuine rate limits still retry and fall back as before. See [pipes](/pipes).
* **timeline uses less memory on dense days** — long recording days could push the timeline into heavy memory pressure and drop parts of the visible range. The timeline now downsamples dense ranges while preserving what you're looking at, so scrolling stays smooth. See [search screen history](/search-screen-history).
* **search keeps returning frames when one frame fails** — a single bad frame in a search result batch used to drop every other frame in that batch. Failures are now isolated per frame so the rest of the results still come through, with OCR and frame alignment preserved. See [search screen history](/search-screen-history).
* **macOS: no more SIGABRT crash on quit** — quitting the app on macOS (Cmd+Q, tray quit, or window close) could crash during shutdown teardown. Quit now runs through a single, unified teardown path and exits cleanly.
* **Linux AppImage: Pi installer runs from AppImage builds** — installing pi from inside the Linux AppImage could fail because a bundled library path was leaking into bun's environment. The path is now scrubbed on Linux and the install completes.
* **enterprise: activation handles more edge cases cleanly** — enterprise license activation is more resilient across stale subscription state, license prompt races, and offline retries, so devices don't get stuck in a half-activated state. See [intune deployment](/intune-deployment).
* **pi-agent self-heals when its install is corrupted** — a Pi agent install left half-copied by an app quit, antivirus lock, or file-system error used to crash-loop forever with a "cannot find module" error, forcing users to manually wipe the install directory. Corrupt installs are now detected, repaired, and rebuilt automatically on next launch.
* **tray no longer stuck on "Starting…" when recording is fine** — the menu bar could sit on "Starting…" forever while capture was actually running (`/health` reporting recording), typically after an audio toggle or a background engine respawn. The tray now follows recording intent, so status matches reality.
* **duplicate transcript lines after a meeting ends** — post-meeting reconciliation could double every line in a stopped meeting's transcript because the same utterance came back from two endpoints with slightly different speaker labels. Duplicates are now collapsed. See [meeting transcription](/meeting-transcription).
* **Windows: recording no longer freezes foreground apps** — the Windows accessibility worker was making synchronous cross-process calls on the target app's UI thread every 2 seconds, producing 100ms+ message-pump stalls in complex apps (Chrome, Slack). The worker no longer runs while its output is unused, so foreground apps stay responsive during recording.
* **retention loop no longer rescans your entire history every 5 minutes** — in Media / Lean retention modes the background cleanup task was restarting its walk from the oldest timestamp on every 5-minute cycle, hammering the DB. The loop now resumes from where it left off, and NULL-poisoned `NOT IN` queries that could skip cleanup are fixed too. See [privacy data flow](/privacy-data-flow).
* **update restart works even when boot phase is "error"** — a boot error used to permanently block the update banner's "restart to apply" button, trapping users on the old build until they quit and relaunched manually. Restart-on-update now proceeds through a failed boot.
* **new installs don't pre-download the 800 MB whisper model** — on first launch the app was fetching the whisper-large-v3-turbo model even when your selected transcription engine was Deepgram, screenpipe cloud, parakeet, or qwen3. The pre-download is now skipped for non-whisper engines and only fires if you switch to whisper. See [meeting transcription](/meeting-transcription).
* **macOS Process Tap no longer churns on quiet machines** — the audio silence watchdog was tearing down and rebuilding the CoreAudio Process Tap every 2-8 minutes when nothing was playing (\~150 rebuilds/day). Silence is now recognized as expected on a quiet machine and the tap is left alone. See [meeting transcription](/meeting-transcription).
* **pipes can continue after a step completes** — pipes that tried to keep running after a "completed" step could stall or return an error instead of moving on. Post-completion continue calls now work as intended. See [pipes](/pipes).
* **owned-browser session fallback + ChatGPT model picker** — LinkedIn and other owned-browser logins now fall back cleanly when the primary session path can't complete, and the ChatGPT connector correctly restores your selected model instead of silently reverting to the default. See [connections](/connections).
* **LinkedIn owned-browser login handles auth cookies correctly** — LinkedIn's cookie-block prompt used to trap the owned-browser login flow. The login page now completes and returns you to screenpipe. See [connections](/connections).
* **CLI retention actually enables when auto-enable runs** — the CLI's automatic retention configuration used to POST to itself without the local auth token, silently 403'ing and never turning retention on — leading to unbounded DB growth. The self-call now authenticates properly. See the [CLI reference](/cli-reference).
* **retention default hardening across store recovery** — a settings store recovered after corruption used to look like a fresh install and would flip the retention default on over an existing archive. The default is now gated on the presence of the actual data directory, so recovered installs never delete media unexpectedly. See [privacy data flow](/privacy-data-flow).
* **chat summary cards don't apply stale preset settings** — clicking a chat summary card could send the new message with the previous chat's preset (model, tools, system prompt) because the click captured a stale closure. The correct preset now applies on every card click.
* **macOS restart no longer aborts teardown** — restarting the app on macOS could abort mid-teardown, leaving background workers running under the old process. Restart now completes teardown cleanly before relaunching.
* **activity summary weekly context is correct again** — the weekly `activity-summary` output on MCP and the Home page was pulling context from the wrong window on the boundary between weeks. The window is now aligned to your local week. See [mcp server](/mcp-server).
* **timeline frame hook order fixed** — a hook-order regression could throw a React error and blank the frame preview on the timeline in some navigation paths. The preview now renders reliably. See [search screen history](/search-screen-history).
* **Pi picks the right reasoning mode for GPT reasoning models** — GPT reasoning models (o-series) weren't being flagged as reasoning models in Pi's generated config, so responses came back without reasoning enabled. They're now marked correctly.
* **search frame previews load the right frame** — the search results page could show a fallback frame that didn't match the actual hit when the primary frame URL failed to resolve. The fallback now matches the search hit. See [search screen history](/search-screen-history).
* **enriched click context is preserved end-to-end** — the accessibility recorder was dropping the enriched click context (ancestor path, roles) when merging events. Downstream search and pipes now see the full click payload.
* **typing and clipboard no longer fire a capture pipeline per keystroke** — key-press, typing-pause, and clipboard triggers used to bypass the capture debounce, chaining a screenshot + tree walk + OCR + DB write on every keystroke during continuous typing. They now share a 1.5s debounce floor and dedup with other triggers, cutting redundant captures by \~90% during typing bursts while still capturing the end of every burst.
* **heavy DBs no longer corrupt with "file is not a database"** — an inline WAL auto-checkpoint on the committing connection could copy a WAL frame to the wrong main-DB page under heavy concurrent load, clobbering the SQLite header. Checkpointing now runs exclusively from a single background maintainer with a bounded WAL cap, closing the corruption path that only reproduced on the largest (multi-GB, high-concurrency) installs.
* **macOS RSS leak from the audio meeting watcher** — the audio meeting-detection loop was leaking one `NSRunningApplication` (plus an `NSLock` and a LaunchServices record) every second, contributing hundreds of MB of steady RSS growth on long-running macOS sessions. Lookups now run inside an autorelease pool and the leak is gone.
* **Windows accessibility walk budgets are enforced again** — the Windows a11y walk didn't honor mid-walk deadlines or the fragile-provider skip on the paired path, and lacked lightweight focused-window metadata — so per-app walk budgets, the terminal / Obsidian OCR throttle, and lock-screen skip were effectively inoperative. All three are back in force, and Chromium / Electron windows now go straight to the fallback walker instead of re-discovering the need every cycle. See [permissions](/permissions).
## week of june 24, 2026
### new features
* **Outlook email connector** — connect just your Outlook mailbox without granting the full Microsoft 365 surface. The new `outlook-email` connection in **settings → connections** authorizes mail-only scopes (read / read-write / send) against Microsoft Graph and stores its token separately from the Teams / Microsoft 365 integration, so the two coexist on the same account. See [connections](/connections).
* **connection-aware trigger picker for pipes** — building a triggered pipe now shows real channel / database / folder selectors instead of free-text. When you pick a Slack, Notion, or Obsidian trigger you see the connected accounts and their resources directly; if the app isn't connected yet the picker surfaces a one-click **Connect** CTA. Multi-account is first-class — pick which workspace fires the trigger. See [pipes](/pipes) and [connections](/connections).
* **per-app connection triggers (Obsidian, Slack, Notion)** — pipes can now fire when a connected app produces a new item (a new Obsidian note, Slack message, or Notion page in a watched database). Each subscription tracks its own cursor and starts from "now" on install, so you don't get backfilled with a year of history the first time you wire a trigger. See [pipes](/pipes).
* **self-improving memory layer for store pipes** — every pipe in the store now opens with a small "continuous improvement" block: it reads a `memory.md` sidecar at the start of a run and can append up to a few dated, one-line lessons at the end. Append-only, capped at \~150 lines / 8 KB, and the pipe never edits its own prompt — so updates from the store still apply cleanly. Pipes carry forward what they learned about your projects, people, and preferences without you maintaining anything. Existing installs are left untouched; new installs ship with the block. See [pipes](/pipes).
* **scriptable notification settings: DND, per-pipe mutes, presets** — the notifications page is now grouped, searchable, and has a global **master switch** that mutes everything except the recording-stopped alert. Per-pipe mute toggles are now actually enforced server-side (they used to be cosmetic), so muting a chatty pipe really silences it. See [home](/home).
* **graceful background model downgrade + in-app advisories** — a Free / Basic pipe pinned to a now-gated model (e.g. Sonnet) used to silently 403 on every background run. Background traffic now downgrades to `auto` and keeps running on a free model instead of failing in the dark; interactive requests still show the visible upgrade prompt. Silent pipe failures that *can't* auto-recover surface as a calm, dismissible in-app advisory (bottom-right) so you actually find out. See [pipes](/pipes).
* **right-click context menu in the chat sidebar** — right-clicking a chat row opens a context menu at the cursor with Pin, Rename, Move to group, Archive, Delete — same actions as the hover ⋮ kebab, just faster. Single-letter shortcut hints (P / R / A / D) act on the highlighted row.
* **summarize button on the meeting note dock** — the summarize action used to live only in the top toolbar. It's now also in the bottom dock next to **stop**, reachable from both ends of a long note without scrolling. See [meeting intelligence](/meeting-intelligence).
* **chat side inspector for outputs and sources** — a new right-side panel in chat surfaces the artifacts a run produced (files written, edits made, pipe outputs) and the sources it pulled from, alongside the conversation. Toggles for the inspector, browser webview, and file preview now sit in the chat header so you can flip between them without losing context; the panel floats on narrow windows so it doesn't crowd the message column.
* **"Move to group" submenu now lists every group you see in the sidebar** — moving a chat used to only show manual groups, so the submenu looked empty for most people. It now lists manual groups *and* the auto pipe-groups in your sidebar, deduped. Moving a chat into a pipe-group name folds it into that same row instead of creating a duplicate section.
* **inline preview for the "AI audio & video analysis" setting** — the cloud media-analysis toggle now sits in **settings → General** next to the other cloud-AI toggles (it used to live under Privacy) and ships with a small animated illustration showing how audio and video/image streams converge into an attested enclave, so it's clear what the switch covers. Behavior is unchanged; respects reduced-motion. See [privacy data flow](/privacy-data-flow).
* **artifacts are searchable by full content** — saved artifacts (files, pipe outputs, chat exports) are now indexed for full-text search, so you can find them by anything in the body — not just by title or filename. See [second brain](/second-brain).
* **one-click OAuth for 10 more connectors** — Linear, Stripe, Sentry, Intercom, Asana, monday.com, ClickUp, Airtable, Confluence, and Jira now connect with a single **Connect** click — no API key to paste, no app to register. The same OAuth panel used by Krisp and Plaud now powers these tiles, and the token is stored in your secret store. Already-connected users keep working as-is; the legacy key / token form is still available under an **advanced** disclosure if you need to view or rotate credentials. See [connections](/connections).
* **Company Brain bundled pipe** — a new guided pipe sets up a shared "company brain" in one pass: it reads the last 7 days of your work (read-only, on-device), picks a shared destination from your existing connections, and installs a workday digest pipe that summarizes decisions, SOPs, open loops, and who-knows-what to a local file. Pushing the digest to the shared destination is opt-in — ask-never-push by default. Install from the pipe store. See [pipes](/pipes).
* **mobile control page** — a new `/mobile` page in the app lets you drive screenpipe from a phone browser: connect to your local or a remote instance, see live online/offline status, list and run pipes, and fire a chat prompt — useful for checking in or kicking off a run from another room without opening the desktop app. See [for developers](/for-developers).
* **friendlier onboarding for non-technical users** — the final onboarding step no longer shows raw store slugs ("digital-clone", "personal-crm") or "install 2 pipes →". Default cards now use plain names ("Your AI twin", "People memory") and the button reads "turn it/them on →", so first-time users who aren't developers can finish setup without learning the word "pipe". Install behavior is unchanged. See [getting started](/getting-started).
* **pi coding agent scrubs secrets from session logs at rest** — the embedded pi agent persists every bash output and tool result to disk for `--continue` history, which used to keep credentials it touched (AWS keys, GitHub PATs, JWTs, bearer tokens, Postgres passwords) in plaintext. A secrets-only scrub now runs best-effort after each pi run over recently-touched session files: only credential spans are rewritten; ordinary text (names, emails, code) is left intact so history stays readable.
### updates
* **upgraded image PII redaction model (rfdetr\_v13)** — the on-device image privacy filter now uses a new detection model trained on real labeled frames. Real-secret recall jumped from effectively 0% to 92–100% on frames that contain a leaked credential, while false-redactions on ordinary frames dropped sharply. The model is also lighter (\~44% less compute, 60 MB fp16) and downloads with a checksum verify. See [privacy filter](/privacy-filter).
* **pipe execution chat display polish** — several rough edges in how pipe runs render in chat are cleaned up: the system prompt now collapses into a labeled summary instead of a wall of text, pipe titles stay consistent (no AI-generated rename), "open in chat" reuses the existing conversation instead of reloading the page, copy-output shows a check-icon confirmation, and navigating to a chat inside a pipe group auto-expands that group. Incomplete pipe runs no longer get saved to history mid-execution. See [pipes](/pipes).
* **"automated" replaces "scheduled" and "triggered" in the pipes filter** — the pipes list used to split self-running pipes across two filter tabs. They're now merged into one **Automated** tab, with **Manual** kept separate for run-on-demand. Running, sorting, favorites, and cloud are unaffected.
* **store "update" UX is in-place** — the **UPDATE** badge on a store pipe card now calls the proper update path (preserves your schedule, model, and enabled state, keeps a `.bak`) instead of re-installing. The badge clears on the card itself with no whole-page refresh and no forced jump to **My Pipes**. Locally-edited pipes get an explicit overwrite-confirm dialog. The badge is also now grayscale instead of off-brand amber. See [pipes](/pipes).
* **premium models gated to the Business plan** — Sonnet 4.5, Gemini 3 / 3.1 Pro, and Qwen3.5-397b joined Opus / GPT-5.x as Business-only. Free / Basic plans keep `auto` and the free / fast models (the free experience is effectively unlimited). Locked models stay visible in the picker as a greyed upsell with a one-click upgrade path, and an at-the-cap banner appears when you hit the daily paid-message limit.
* **DeepSeek removed from the AI gateway** — DeepSeek is no longer offered as a model option in the cloud AI gateway.
* **free models get their own, much higher per-minute rate limit** — free models (`auto`, GLM, Kimi, Gemini Flash, …) used to share the same low per-minute bucket as paid models, so the "switch to a free model to avoid rate limits" advice didn't actually help. Free traffic now meters in a separate, much larger bucket (60 / 120 / 240 per minute for anonymous / signed-in / subscribed) and never blocks paid requests. The per-user daily cost cap is unchanged.
* **clicked-element labels in captured actions** — recorded clicks used to read "click AXGroup" most of the time on the web, because macOS hit-testing lands on a generic container. The capture now descends into the labeled control under the cursor and records something specific like "click AXButton: Continue" or "click AXTextField: Email", so captured action streams are usable for automation and SOP generation.
* **enterprise: device logs auto-submit when enrollment can't reach upload** — enrolled devices that weren't uploading logs (network, misconfig, paused agent) now auto-submit on a watchdog so support can see them without a manual back-and-forth. Cooldown survives restarts, so a healthy device doesn't spam uploads.
* **enterprise license prompt moved to the top of settings** — the enterprise license entry point now sits at the top of the settings list instead of being buried near the bottom, so enrolling a managed install is easier to find.
* **enterprise: managed device settings are now actually enforced** — several **Managed settings** policies were silent no-ops on devices: **Screen recording: Always off**, **Audio recording: Always off**, **Meeting detector**, **Listen on LAN**, **Transcription engine**, and **Analytics**. They now apply on the device (engine restarts once when a value changes; analytics applies live with no restart), so admin policy actually takes effect. See [Intune deployment](/intune-deployment).
* **enterprise: hidden-mode auto-update respects MDM/Intune** — devices running in hidden mode used to force the in-app auto-updater on, which would fight an org that manages updates through MDM or Intune. The hidden-mode force is now skipped when updates are externally managed, so MDM-driven rollouts stay in control. See [Intune deployment](/intune-deployment).
* **enterprise: clearer "centralized data not enabled" message** — when an org hasn't toggled on centralized data in the dashboard, enrolled devices used to log a misleading "license rejected by ingest endpoint" even with a valid, active license. The device log now says plainly that centralized data is not enabled for the org and that an admin needs to turn it on in the dashboard. The upload-mode line in support feedback also now names the mode (`hosted_ingest` / `direct_readable` / `direct_encrypted`) instead of a bare discriminant.
* **desktop app v2.5.79** — rolls up this week's fixes: floating search first-open freeze, MCP-OAuth connections visible to the chat agent and shown as connected, OAuth callback / result page polish, and the Linux AppImage runtime-deps bundle.
* **CLI v0.4.25** — ships the engine fixes that already landed in the desktop app to CLI users: the SQLite write-queue wedge recovery, the tesseract pre-flight that prevented missing-binary panics, the macOS mic-permission Sentry noise filter, the macOS ffmpeg install loop, and the AppImage runtime-deps bundle. See [CLI reference](/cli-reference).
* **OAuth callback and result pages refreshed** — the success / failure pages you land on after connecting a one-click OAuth connector are cleaner, on-brand, and default to light mode for legibility. Behavior is unchanged. See [connections](/connections).
### bug fixes
* **embedded engine auto-respawns when it crashes mid-recording** — if the in-app engine died while recording was supposed to be on (tray icon gone, local API on `:3030` unreachable), nothing brought it back up — recording just sat stopped until you noticed. The desktop app now supervises the engine the same way `launchd` / `systemd` supervises the standalone CLI: on a real crash with recording still wanted, the watchdog respawns it.
* **capture auto-restarts when it silently freezes** — on macOS, ScreenCaptureKit can stop delivering frames while the capture loop and HTTP server stay alive — the classic "screenpipe says it's recording but I have no screenshots for days" symptom, usually only unwedged by a screen lock/unlock. The health watchdog now detects sustained staleness and restarts the capture session in place automatically, instead of only showing a manual-restart notification gated behind a default-off preference. Applies to the CLI and the desktop app. See [troubleshooting](/troubleshooting).
* **clear notification when DB-wedge recovery can't restart recording** — when the SQLite "disk image is malformed" auto-recovery can't bring the engine back up (or gives up after retries on genuine on-disk corruption), you used to be left with recording silently stopped. Both failure modes now fire a notification so you know to take action. See [troubleshooting](/troubleshooting).
* **deleting a speaker with local audio chunks no longer 500s** — the trash icon on the speakers page failed for essentially every identified speaker that had any local (non-cloud) audio chunk. Fixed. Cloud-only and empty-speaker deletes were already working and are unaffected.
* **meetings no longer flap `Active ⇌ Ending` on minimized / tab-switched calls** — a call with output audio still flowing but no visible controls used to bounce between **Active** and **Ending** once per scan interval (24+ flaps on a multi-minute call), spamming logs and telemetry. Audio-sustained meetings now stay Active. Total flap count across the meeting-eval suite dropped 86%. See [meeting intelligence](/meeting-intelligence).
* **Webex used for chat no longer starts phantom meetings** — Webex runs messaging and meetings under one process, and its messaging window's "Leave space / Leave team" button matched the call-detection `leave` signal — so leaving Webex open for chat created phantom meetings and unwanted audio transcription. The detector now ignores the bare `Webex` window title (always a chat window — real meetings are titled with the meeting / space name). See [meeting intelligence](/meeting-intelligence).
* **listening-wave indicator stays animated at audio level 0** — the bottom-left "listening" indicator in the meeting note dock looked frozen at \~35% height during silence (or whenever the audio-level reading came back as 0, the common case). The resting wave now sits as lively as the other listening indicators across the app while still rising on loud audio. See [meeting transcription](/meeting-transcription).
* **long meeting titles no longer break the "Coming up" card layout** — a long, non-wrapping meeting title pushed the right-arrow outside the card border. Titles now truncate with an ellipsis and the row stays inside the card.
* **persistent sidebar scrollbars on Windows / Linux are hidden** — expanding a pipe section in the chat sidebar used to make a persistent classic scrollbar pop in on Windows / Linux (Chromium auto-hides nothing) while macOS rendered the same scrollbar as an overlay. The sidebar now hides its scrollbars off macOS, matching the rest of the shell.
* **Gemini / Vertex no longer 400 on replayed chat history with nameless tool calls** — replaying a chat that included an assistant tool call with an empty function name caused Vertex MaaS and Gemini to reject the entire request. The AI proxy now strips unexecutable nameless tool calls (and their orphaned tool results) before forwarding, so the rest of the conversation goes through cleanly. Ships independently of an app release — reaches you on the next gateway deploy.
* **macOS ffmpeg auto-install loop / false "not found" on first launch** — on macOS, a prior ffmpeg install to `~/.local/bin` wasn't visible to the running app, so every launch re-attempted the install and reported a misleading "No such file or directory" — which broke first-run capture for some users on 0.4.23. The resolver now finds the existing binary and validates installs by the file on disk instead of a path probe. Windows / Linux are unchanged. See [troubleshooting](/troubleshooting).
* **AI gateway retries transient Cloudflare / network blips during sign-in token minting** — an occasional 522 or 5xx from the upstream token chain used to fail the whole request with "WIF SA impersonation failed". Token minting is idempotent, so the gateway now retries up to 3× with backoff on 522 / 5xx / network errors and surfaces real 4xx errors immediately. Ships on the next gateway deploy — no app update needed.
* **manually started meetings can be stopped from any client** — a frontend / backend state desync left manually-started meetings stuck "active" — every stop click returned 400 and the UI never recovered. The stop endpoint now tolerates an empty body (so MCP and other body-less clients work), stopping an already-ended meeting is idempotent, and the UI resyncs against the server on a stop failure instead of hammering a stale id. See [meeting intelligence](/meeting-intelligence).
* **a false-positive meeting can no longer wedge audio capture** — a misidentified meeting plus a stalled write pool could leave audio deferred forever, with hundreds of transcription segments stranded and only an app restart clearing it. The stop handler now releases the in-meeting flag and detector state before any database write, so a wedged pool can't deadlock stop and the queue drains on its own. See [meeting transcription](/meeting-transcription).
* **search bar opens instantly after the first time** — the floating search bar used to be destroyed on close and rebuilt from scratch on every open, freezing the input for several seconds before you could type. The bar now stays warm in the background and just resets on open, so every open after the first is instant. See [search screen history](/search-screen-history).
* **`/health` clears `active_no_data` once audio recovers** — a single transient stream timeout pinned audio status to `active_no_data` for the lifetime of the process, so a fully recovered mic still reported broken and `/health` stayed degraded. The check now keys on recency, not lifetime count, and silent-but-healthy rooms also report `ok`. See [for developers](/for-developers).
* **settings and AI model config survive an unexpected shutdown** — a power loss mid-save could leave `store.bin` truncated and on next boot the desktop app would treat the install as fresh, overwriting it with defaults — wiping all settings, including configured AI models. Every settings write (and its recovery snapshot) now uses a durable temp-file + fsync + rename, so a write either fully lands or fully doesn't. See [troubleshooting](/troubleshooting).
* **pipe notification mute is enforced at the `/notify` boundary, and `/notify` no longer hangs** — a muted pipe could still emit notifications if its code called the notify endpoint directly, and a stalled notification panel could hang `/notify` requests forever. The mute toggle is now enforced at the API boundary (so muting always silences a pipe), and stuck panel UI no longer blocks notifications. See [pipes](/pipes) and [home](/home).
* **screen capture handles rare Apple OCR nil errors instead of crashing the worker** — OCR worker no longer panics on transient nil responses from the system OCR framework. Capture stays running.
* **disabled audio capture is respected on startup** — turning audio off in settings could still bring the audio pipeline up on the next launch. The recording starts now actually skip audio when it's disabled. See [meeting transcription](/meeting-transcription).
* **wlroots-based Wayland compositors capture again** — Linux users on Sway, Hyprland, and other wlroots Wayland compositors can capture the screen again — capture now uses `grim` on wlroots instead of the portal path that didn't work there. See [search screen history](/search-screen-history).
* **enterprise app routes consumer subscribers correctly** — the enterprise-app gate misrouted consumer subscribers; signed-in consumer accounts now land in the regular app, and signing out / switching accounts cleans up properly.
* **onboarding login no longer dead-ends when signed in without an entitlement** — an enterprise member who signed in before their grant propagated (or with the wrong email) used to be stuck on "✓ signed in" forever with no way forward. The step now re-verifies the entitlement against the server and, if still not entitled, shows a recovery panel with their account, a re-check button, and a "use a different account" option. See [getting started](/getting-started).
* **enterprise users are steered to the enterprise app** — an enterprise account opening the consumer app is now pointed to the enterprise build instead of falling through silently.
* **meeting note placeholder cursor sits in the right place** — the cursor in the empty meeting note no longer jumps after the placeholder text, so typing starts where you expect. See [meeting intelligence](/meeting-intelligence).
* **timeline transcript backfills merge instead of stacking** — transcripts that arrive in chunks now merge cleanly into one timeline run, instead of stacking duplicate or overlapping segments. See [search screen history](/search-screen-history).
* **frame API now requires authentication** — the local frame endpoint is now gated behind the same local auth as the rest of the API; unauthenticated callers can't pull frames over the loopback HTTP server. See [for developers](/for-developers).
* **HD meeting recording covers the whole call, not just the first 30 minutes** — on the desktop app, HD recording silently dropped back to normal capture 30 minutes into any longer meeting, so the back half of long calls was never captured in HD. HD now stays bound to the call from start to end (with a 4-hour cap), ending when the meeting actually ends. See [meeting intelligence](/meeting-intelligence).
* **search and timeline thumbnails load under API authentication** — with **Require authentication** enabled (the default on enterprise / admin builds), frame thumbnails in search results, the timeline, hover previews, Live Text, and the chat prefill banner used to 403 and render as "unavailable" — because ` ` tags can't send an auth header. Thumbnails now load cleanly under auth. No change when auth is off. See [search screen history](/search-screen-history).
* **sidebar recording dot is visible in light mode** — the recording indicator in the translucent sidebar was rendered white-on-white in light mode, effectively invisible. It now follows the theme — black on light, white on dark. See [home](/home).
* **voice sample playback is reliable on Windows** — playing back a saved speaker voice sample from the speakers page used to fail intermittently on Windows. Playback is now reliable across platforms. See [meeting transcription](/meeting-transcription).
* **pipe-logs API returns data after an app restart** — fetching a pipe's logs over the API used to come back empty until the pipe ran again after the app restarted. The API now reads back the on-disk history immediately, so previous runs show up right away. See [pipes](/pipes).
* **chat sidebar polish: move-to-group, header, inspector button** — fixes a cluster of small chat-sidebar issues: the **Move to group** submenu now lays out correctly without overflowing, standalone chats get a proper header title and spacing, sidebar grouping behaves consistently across pinned / archived rows, and the inspector toggle button stays visible when the inspector panel is closed.
* **floating search bar opens fast on the first open after launch, too** — a previous fix made the search bar instant on the 2nd+ open in a session, but the very first open still froze 10–20 seconds on large histories (cold webview boot plus a per-file stat storm over 15k+ chats plus a 24h OCR scan racing first paint). The search window now pre-warms at startup, uses one native directory scan instead of thousands of round-trips, and defers the cosmetic suggestions scan — so the first open is fast too. See [search screen history](/search-screen-history).
* **one-click OAuth connectors (Linear, Stripe, Sentry, Notion, …) show as connected to the chat agent** — connectors connected via the new one-click MCP-OAuth flow were stored separately from the legacy connector secrets, so `GET /connections` still reported them as not connected — and the in-app chat agent would tell you "Linear is not connected" immediately after you connected it. The list now reconciles MCP-OAuth connections back to their connector, so the agent sees them as connected. See [connections](/connections).
* **provider tiles correctly show as connected** — connection tiles for one-click OAuth providers now flip to **connected** as soon as the OAuth flow returns, instead of staying greyed out until the next refresh. See [connections](/connections).
* **SQLite "cannot start a transaction within a transaction" write wedge fixed** — recurring audio-chunk and UI-event batch insert failures that surfaced as `SQLITE code 1` (a pooled connection coming back mid-transaction from a previous wedge) are now cleared before the next batch begins, so the write goes through on the first try instead of after the reactive retry. Recording stays running and the error stops surfacing. See [troubleshooting](/troubleshooting).
* **legacy custom-vocabulary entries no longer break recording settings** — a `vocabularyWords` list that mixed plain strings (the older format) with structured entries used to fail deserialization for the entire **Recording** settings object, leaving the page unable to load. Both shapes are accepted again. See [meeting transcription](/meeting-transcription).
* **macOS capture-permission denials no longer flood telemetry** — the periodic device check used to upload one Sentry event per cycle when screen / audio capture was denied in **System Settings**, including localized (non-English) denial messages that bypassed the existing filter. Permission-denied events are now filtered out in any locale; they still appear in your local logs, only the upload is dropped. See [permissions](/permissions).
* **Linux AppImage launches reliably on more distros** — the AppImage now bundles its runtime dependencies, falls back to system ffmpeg sidecars when the bundled binary isn't usable, retries static-ffmpeg downloads on flaky networks, provides a `qt-faststart` fallback, and preserves the launcher's executable bit — so first launch works on more distros without manual fix-ups.
## week of june 23, 2026
### new features
* **"download my archive" export** — cloud archive used to be upload-only: local data older than your retention period was deleted after upload, with no way to get it back. A new button in **settings → archive** downloads every archived blob, decrypts it locally, and writes it to a folder (`media/` for mp4 + jpg, `metadata/` for JSON), with live progress and an **open folder** action when it's done. Works even when archiving is disabled. See [cloud archive](/cloud-archive).
* **screenpipe on the go: selective sync + one-command agent setup** — two pieces for running screenpipe headless on a remote machine and pointing an agent at it. `screenpipe sync` now accepts `--no-media` (skip the heavy `data/` capture files) and `--exclude ` (repeatable), and honors a `.screenpipeignore` file in your data dir — useful for shipping just text + memories to a VPS without the media. `screenpipe agent setup [--api-url URL]` writes the screenpipe skills into the agent's skills dir and registers the screenpipe MCP server in its config in one command — idempotent, preserves existing servers. Pass `--api-url` so the agent talks to a synced/remote screenpipe instead of localhost. Headless `screenpipe login` now writes the cloud token to a place the engine actually reads, so cloud features work on a VPS without the desktop app. See [CLI reference](/cli-reference) and [connections](/connections).
* **Hermes Connect tab** — Hermes was already wired as a read-only client (MCP / Skill / remote sync). The new **Connect** tab in **settings → connections → Hermes** lets screenpipe pipes push events, messages, or jobs *into* a running Hermes agent via its OpenAI-compatible API server, matching the existing OpenClaw flow. See [connections](/connections).
* **chat sidebar groups recurring pipe sessions, plus manual groups** — the chat sidebar now folds recurring sessions for the same pipe under one group instead of one row per run, and you can create your own named groups for ad-hoc chats. Recents is capped at 15 rows globally so long histories don't push everything else off screen.
### updates
* **monitors picker sits directly under "use all monitors"** — toggling **use all monitors** off used to reveal the per-monitor picker several cards down the **screen** section, visually disconnected from the toggle that controlled it. The picker now appears immediately under the toggle.
### bug fixes
* **screenpipe cloud transcription respects your language selection again** — cloud (batch) transcription was silently falling back to English regardless of which languages you picked. The cloud worker now maps a single selected language to forced-language mode and "none / many" to multilingual auto-detect, matching the live-meeting path. Ships independently of an app release — reaches you on the next worker deploy. See [meeting transcription](/meeting-transcription).
* **DB "disk image is malformed" wedge recovers in-process** — after macOS sleep/wake, SQLite's WAL-index could desync and leave every write failing with code 522. The in-process recovery now closes the lingering secret-store connections so SQLite can rebuild the shared-memory mapping cleanly, instead of needing a full quit + relaunch.
* **local connection 401s no longer sign you out** — if your connected-account email was on a `@screenpi.pe` / `@screenpipe.com` domain, a transient 401 from a *local* connection (e.g. a Google Calendar token refresh blip) could be misread as your cloud session expiring, sign you out, and pause recording. The auth interceptor now matches on the URL host (never a substring), and localhost / 127.0.0.1 are never treated as the cloud auth surface. See [connections](/connections).
* **start/stop recording hotkey fires a notification** — the global start/stop-recording shortcut only emitted an in-app toast, which is invisible when the main window is hidden — exactly when a global hotkey is for. Toggling recording from the keyboard now fires a notification panel so you get glance-level confirmation regardless of window visibility.
* **opening screenpipe from the taskbar / dock lands on home** — clicking the taskbar (Windows) or dock entry while screenpipe was already running used to focus the timeline overlay instead of the home window. It now opens home, matching what you expect from a second app launch.
* **meeting detector: bare-host URL patterns no longer match lookalike domains** — meeting-URL patterns like `daily.co`, `app.daily.co`, `pop.com`, `8x8.vc`, and `meet.jit.si` were substring-matched against the page URL, so `daily.co` flagged `thedaily.com`, `dailywire.com`, and `daily.com` as phantom meetings — which an unrelated tab's "Leave" / "End" button could then sustain. URL patterns now match on host boundaries (a whole hostname or a real subdomain) and, when path-qualified, on bounded path components. See [meeting intelligence](/meeting-intelligence).
* **macOS CoreAudio tap can no longer be left orphaned** — on macOS, stopping audio capture could skip the teardown step that releases the CoreAudio Process Tap, leaving it orphaned and wedging `coreaudiod` system-wide. The stop path is now idempotent — it always drives the stream teardown — so the tap is released every time.
* **MCP `activity-summary` labels time ranges in your real timezone** — the per-app time range printed by the MCP `activity-summary` tool sliced HH:MM out of a local timestamp but hardcoded a " UTC" suffix, so a 09:03 IST frame printed as "09:03 UTC" — off by the offset. The label is now derived from the timestamp's own offset (`UTC`, `+05:30`, etc.). See [MCP server](/mcp-server).
* **Claude Desktop MCP install state stays in sync with the config file** — the **install screenpipe MCP into Claude Desktop** action in **settings → connections** could show stale state because the config-path lookup wasn't shared with the install-check. Both paths now resolve the config the same way, so the install / installed state reflects what's actually in `claude_desktop_config.json`. See [connections](/connections).
* **macOS click context: screenpipe ignores its own clicks** — on macOS, the click-context capture used to occasionally attribute clicks to screenpipe's own UI; it now skips its own process so click context only reflects what you're doing in other apps.
## week of june 22, 2026
### new features
* **brain: memories and artifacts split into two views** — the Brain section is now two focused panes instead of one mixed feed: a **memories** view with scalable multi-tag filters and inline editing in a dialog, and an **artifacts** view with refined cards grouped by origin. Memory previews now render markdown (parsed via AST, not behind a heavier renderer), so adding and editing memories is snappier. See [second brain](/second-brain).
* **`/search`: one call returns related context with `include_related=true`** — pass `include_related=true` alongside `tags=…` and the response now attaches a `related` block: the tags that co-occur with the ones you asked for, grouped by namespace (`people`, `projects`, `workflows`, …) and ordered by frequency. AI callers get the surrounding context in one request instead of several. Memory results also expose `frame_id` so you can jump straight from a memory to the exact captured moment via `GET /frames/{id}`. Bounded by a 5s timeout — auxiliary, so a slow store degrades to `related: null` instead of dragging out the search. See [API recipes](/api-recipes) and [search screen history](/search-screen-history).
* **"shape screenpipe" survey card in Help** — a new card near the top of **settings → help** opens a short survey so you can steer where the product goes. Sits after **send logs** and **getting started**.
### updates
* **Input Monitoring lives in Privacy now, not Connections** — on macOS, **Input Monitoring** is a system permission that gates keyboard and click capture — it isn't a "connection" like Claude or Slack. It's been moved out of **settings → connections** (tile, dialog, chat connection chip) and into **settings → privacy → capture rules**, right below the **capture clipboard / keyboard / clicks** toggles it actually controls. Behavior unchanged.
### bug fixes
* **`/search` no longer crashes on absurd relative-time inputs** — a request like `/search?start_time=99999999999999w` (or any value large enough to overflow a `Duration`) used to panic inside the query-string parser, reset the connection, and surface in the logs. Out-of-range magnitudes now fall through to the existing "invalid time" 400 path. Every search and Rewind time filter funnels through this parser, so the fix covers them all. See [search screen history](/search-screen-history).
* **retention loop survives a bad `retention_days` value** — a persisted config from an older client could carry a `retention_days` large enough to underflow the cutoff date and panic the background retention task silently — so retention stopped deleting without any signal. The cutoff is now computed through a checked helper that logs and skips the cycle on overflow, and the configure endpoint now rejects values outside 1–36500 days with a clear 400. See [privacy data flow](/privacy-data-flow).
* **`/search?max_content_length=0` returns the full text again** — `0` is the documented "opt out / full text" signal, but the HTTP `/search` handler was treating it as "truncate to zero" and returning just `...(truncated N chars)...`, destroying the text the caller asked to see in full. MCP and CLI clients that forwarded `max_content_length=0` were hit too. Zero is now a no-op, matching the MCP and CLI contract. See [API recipes](/api-recipes).
## week of june 21, 2026
### new features
* **inline "show, don't tell" previews across settings** — abstract toggles in **settings → recording**, **storage**, and **notifications** now render small grayscale illustrations that show what each knob actually does: a filmstrip whose density tracks **capture frequency**, a day-strip for **audio capture mode**, a per-piece view of what each **retention mode** drops, segmented tradeoff meters for **power mode**, an on-device-vs-cloud data-flow for **transcription**, and a sample toast for **notification** toggles. Visual only — every setting works the same. See [search screen history](/search-screen-history), [privacy data flow](/privacy-data-flow), and [meeting transcription](/meeting-transcription).
* **hover-to-highlight "where we look" preview in privacy settings** — the redaction panel now shows a small mock app window beneath the surface toggles: hovering a row outlines the matching region of the sample screen, and turning a surface on covers that region with a redaction bar. Pairs with the existing "what to hide" preview so both axes (what is hidden / where we look) are legible without a real captured frame. See [privacy filter](/privacy-filter).
* **form-field values redacted by default, plainer redaction UX** — when smart text redaction is on, **form field values** (the surface where typed passwords and other real PII live, including values accessibility exposes but OCR never sees) are now redacted by default. The redaction panel is split into **what to hide** (categories — primary) and **where we look** (surfaces — advanced, collapsed), with plain-language labels: *form field values*, *links inside app data*, *passwords & keys*. Existing user configs are honored exactly. See [privacy filter](/privacy-filter).
* **frontier models can no longer be assigned to background pipes** — pipes are unattended and often high-volume, so a frontier model (Opus, GPT-5.5, \*-pro, Fable — output ≥ \$20/Mtok) used to be a cost bomb if your default preset was pinned to one. The app now coerces frontier presets to **auto** when assigning a model to a pipe, and the AI gateway enforces the same rule as a backstop on background traffic (downgrade by default, hard-reject via `PIPE_FRONTIER_POLICY=reject`). Interactive chat is untouched — you can still pick a frontier model for live chat. See [pipes](/pipes).
### updates
* **plainer copy in recording & notifications settings** — jargon like *spectral analysis*, *silence-gap detection*, *clamshell*, and raw CLI flags has been replaced with plain descriptions of what each toggle does ("groups audio into longer stretches before transcribing", "laptop lid closed", "tells you when…"). No behavior change.
* **live meeting notes: engine picker inline on the header row** — the **live engine** selector now sits next to the live-meeting-notes toggle on the same row, and hides when the feature is off, instead of taking a separate labeled sub-row. See [meeting intelligence](/meeting-intelligence).
### bug fixes
* **frozen screen-capture streams recover on their own** — on macOS, ScreenCaptureKit could wedge its output callback so every screenshot returned the same stale frame silently for as long as the wedge lasted (observed: 400+ byte-identical snapshots over 30 minutes while the user kept working). The capture loop now detects a flat frame-delivery sequence across captures and rebuilds the stream automatically, with a per-monitor cooldown to prevent thrash. Idle content and look-alike window switches still advance the sequence, so this can't false-positive on a quiet screen. See [search screen history](/search-screen-history).
* **timeline stays live after sleep or network changes** — when the machine slept, the OS could tear down the timeline's WebSocket while JS was frozen, leaving the socket reading *open* but never delivering frames. The timeline used to sit frozen on the last pre-sleep frame until you hit refresh, and reconnect gave up after \~10 attempts. A liveness watchdog now force-reconnects a silent-but-open socket, reconnect retries indefinitely with capped backoff, focus reconnects a stale socket, and the displayed frame auto-advances at the live edge as new frames stream in. See [search screen history](/search-screen-history).
* **Brain finds HTML artifacts in fallback discovery** — HTML files generated by pipes and agents are now included in Brain's fallback artifact search (and search matches by filename and path), so HTML artifacts no longer go missing when the primary index doesn't have them. See [second brain](/second-brain).
* **per-row "optimize with ai" button on pipe cards is labeled correctly again** — the always-visible per-row button on pipe cards is back to **optimize with ai** (was briefly relabeled **edit** while the underlying flow stayed the same), so the affordance users relied on is discoverable again. The button still reads the pipe prompt and recent run logs and suggests improvements. See [pipes](/pipes).
* **OAuth connections resolve the right named instance for Microsoft 365 and Pi** — when you connected multiple named OAuth instances (e.g. personal + work), follow-up calls could resolve to the wrong instance and fail. The connection layer now picks the named instance you actually targeted. See [connections](/connections).
## week of june 20, 2026
### new features
* **flat Rewind-style timeline** — the timeline bar is now a constant-height horizontal strip with rounded-pill segments per app run and a small gap at each app or site transition. Browser sessions split into one segment per site (colored by site, not by browser), audio segments show as a thin white line above the bar, and tags appear as a thin amber underline. The playhead is a clean vertical line with a white time chip that no longer bobs while scrubbing. See [search screen history](/search-screen-history).
* **capture frequency floor** — a new slider in **settings → recording** guarantees a screenshot at least every N seconds (1–10s) regardless of whether anything changed on screen, so a still screen no longer goes uncaptured for minutes. Default `auto` follows the existing power-profile cadence; setting a value pins the floor and survives power-profile transitions. See [search screen history](/search-screen-history).
* **"lean" retention mode** — a new third option in **settings → storage policy** sits between **media** and **all**. Past the retention cutoff, lean reclaims media files *and* drops the heaviest text columns (accessibility element tree, raw accessibility JSON, keystroke/click stream) while keeping text search, transcripts, and memories intact — so the database file actually shrinks instead of just the on-disk media. See [privacy data flow](/privacy-data-flow).
* **hide dock icon on macOS** — a new macOS-only toggle in **settings → display** runs screenpipe as a menu-bar-only app with no Dock icon. The tray icon stays visible so the app is always reachable; default off, current behavior unchanged.
* **Grok CLI as an MCP client** — a new Grok CLI tile in **settings → connections** one-click installs the screenpipe MCP server into Grok CLI, alongside Claude Code, Codex, Copilot CLI, and the other supported agents. See [connections](/connections).
* **one-click "connect with Bee"** — the Bee wearable connection now uses Bee's native device-pairing flow (the same one `bee login` runs) instead of a manual Developer Token paste, so connecting is one click and there's no more pointing at a portal that no longer exists. See [connections](/connections).
* **PII redaction covers all remaining capture surfaces** — the on-device redaction worker now also scrubs the per-element accessibility properties (including focused-field and password-field values that accessibility exposes but OCR never sees), `ui_events` element name and description, window titles, browser URLs, and the raw accessibility tree JSON served by `/frames/:id/context`. Frame-derived columns are propagated from a single detection pass, so the extra coverage adds no new model calls. See [privacy filter](/privacy-filter).
### updates
* **recording → audio settings, regrouped** — the previously flat list of \~16 audio cards is now organized into four labeled sub-sections (transcription, meetings, devices & capture, voice & vocabulary) so related settings sit together. Purely presentational — every setting works the same.
* **search prioritizes keyword matches** — `/search` results now surface keyword matches ahead of secondary semantic results, and facet queries are capped so they can't drown out the primary hit. See [search screen history](/search-screen-history) and [API recipes](/api-recipes).
* **per-pipe last-run badge is accurate again** — the **last run** column on the pipes list now reflects real run history instead of showing **never run** for every pipe. The data was always there; the list now actually asks for it. See [pipes](/pipes).
* **HTML artifacts render in chat and Brain** — AI- and pipe-generated HTML artifacts now render in chat (previously source-only) and expand correctly from the Brain section, both inside the same locked-down sandbox so artifact styles can never leak into and repaint the app window. See [pipes](/pipes).
* **background AI traffic back on Gemini flex tier** — the AI gateway's background head (pipes, daily summary, suggestions) routes through `gemini-3.5-flash:flex` again — measured roughly 3.3× cheaper than the previous head for comparable quality on background work. Interactive chat is unaffected.
### bug fixes
* **OAuth connections work with a relocated data directory** — users who moved their screenpipe data directory could complete an OAuth connect (Microsoft 365, Google, ChatGPT, …) but every follow-up call failed with "no credentials found". Tokens were being written to one database and read from another. Tokens now always land in the configured data directory, and existing broken installs heal on next launch. See [connections](/connections).
* **OCR works on the Linux CLI without a system tesseract** — the npm `@screenpipe/cli-linux-x64` package now bundles tesseract and English language data, so OCR works on Linux hosts that don't have a system tesseract installed (matching what the AppImage and .deb already do). See [search screen history](/search-screen-history).
* **Windows speaker transcriptions during meetings** — Windows users were silently losing the far side of meetings when the meeting app rendered audio to an endpoint that wasn't the captured one (Meet/Zoom output picker changes, auto-switched USB defaults). The device monitor now follows actually-rendering endpoints, watches for sustained "audio playing, no speaker chunks landing" during meetings, restarts output capture if it wedges, and surfaces a notification with a one-click restart action when speaker capture stays dead. See [meeting transcription](/meeting-transcription).
* **mic fails over to the built-in input when AirPods disconnect** — if your pinned input device disconnected and was also the system default (typical AirPods setup), capture stopped entirely until you manually reconnected. The fail-over decider now picks any present input — preferring the on-board mic — instead of sitting idle, while still respecting user-disabled devices. See [meeting transcription](/meeting-transcription).
* **Windows audio: no more crash on non-default / virtual input devices** — capturing from a device that reports zero channels (virtual cables, some non-default WASAPI endpoints) no longer panics the capture thread and takes the app with it. Also fixes two COM resource leaks in the 2-second communications-device poll on Windows.
* **`/health` no longer flips to 503 on machines with no microphone** — RDP sessions, VMs, and desktops with speakers only used to mark the engine as **degraded: audio** after 120s, which also triggered a phantom "mic not capturing" notification. A missing input device is now reported as a benign idle state; real silent mics still degrade as before. See [for developers](/for-developers).
* **media paths starting with `~/` actually load in chat** — when the agent referenced a file as `~/Downloads/clip.mp4`, the inline media player was stripping the `~` and trying to open `/Downloads/clip.mp4`. Home-relative paths (and Windows `~\\` paths) now expand correctly, so files referenced with a tilde render inline.
* **timeline delete: inline confirm, loading spinner, no double-click trash** — selecting a range and clicking the trash on the timeline used to require two clicks (a centered modal rendered behind the floating toolbar) and gave no feedback while the delete ran. The confirm is now inline next to the trash, the button shows a spinner while deleting, and the modal stacking footgun is gone. See [search screen history](/search-screen-history).
* **timeline no longer crashes on frames without a `devices` field** — guarded against an `undefined` devices array that could throw `TypeError` and crash the entire timeline render under certain stream conditions. See [search screen history](/search-screen-history).
* **`screenpipe://` deep links and notification "open" actions land on the right window** — pipe stop, chat sidebar, and pipes-page stop flows now agree on running state, so stopping a pipe from any surface succeeds on the first click and doesn't leave a stale "running" indicator. See [pipes](/pipes).
* **calendar month nav stops at today** — the timeline's date picker can no longer page into impossible future months. See [search screen history](/search-screen-history).
* **AI gateway: long tool-call IDs and Gemini flex region errors** — fixed two top gateway crashes: OpenAI was rejecting tool-call IDs longer than 64 characters (which GLM and Gemini routinely mint), and Gemini flex requests in unsupported regions used to fail outright. Long IDs are now remapped to a short stable form across the assistant and tool turns, and flex-unsupported responses retry the same model at standard tier instead of erroring.
* **embedded browser hides itself behind modal dialogs** — opening a modal dialog while the in-app browser was visible used to leave the native webview painted on top of the modal. The webview now hides while a modal is open and restores when it closes. See [pipes](/pipes).
## week of june 19, 2026
### new features
* **home grid refocused on 4 high-signal cards** — the home page now ships a curated set of cards: **Automate My Work**, **Day Recap**, **Time Breakdown** (promoted), and a new **Missed To-Dos** card that surfaces action items from the last few days you may have missed. The longer discover tier is gone — clicks were going to the top tier anyway. Prompts for the kept cards were tightened too. See [home](/home).
* **Automate My Work actually builds the automations for you** — the Automate My Work card now analyzes your recent activity and creates three read-only, hourly automations tailored to your workflow, instead of just suggesting pipes and waiting for you to confirm each one. The created pipes use the **reader** permission, so they can never send, post, or modify anything. See [pipes](/pipes).
* **meetings auto-name speakers from on-screen name tags** — meeting summarization now reconciles generic labels like *speaker 1* or *unknown* against the name tags video-call apps render on screen, using OCR frames screenpipe already captures. It only renames on unambiguous evidence and never prompts you. See [meeting intelligence](/meeting-intelligence).
* **one-tap push of a meeting summary to a connected app** — after a meeting summary is saved, screenpipe now lists the apps you've actually connected (ranked by the apps you used in the meeting) and asks before pushing — as one-tap action buttons on the meeting notification, or as a message in chat. Nothing leaves your machine until you pick a target. See [meeting intelligence](/meeting-intelligence).
* **hover the timeline to preview frames** — hovering the bottom track on the timeline now shows a thumbnail of the frame at that point, so you can scrub to the right moment before clicking. See [search screen history](/search-screen-history).
* **timeline date pill shows the time** — the date pill at the top of the timeline now includes the time of the visible position, so you always know what moment you're looking at without zooming in.
* **lean toggles for `/activity-summary`** — `GET /activity-summary` now accepts `include_key_texts`, `include_apps`, and `include_windows` query params. Set any to `false` to omit that section from the response — useful for pure time-tracking sweeps across many ranges where the text-heavy `key_texts` is the biggest token cost. Defaults are unchanged. See [API recipes](/api-recipes).
* **`screenpipe profile` CLI command** — a new `screenpipe profile` subcommand prints per-stage pipeline timing (capture, OCR, audio, embed, write), so you can see where time is going on your machine without attaching a profiler. See [CLI reference](/cli-reference).
* **per-pipe logs are archived into dated folders** — old pipe logs are now rotated into dated subfolders instead of growing forever in a single file, so it's easier to find the run you care about and easier to clean up. See [pipe debugging](/pipe-debugging).
### updates
* **Zoom supports multiple OAuth accounts** — the Zoom connection now lets you connect more than one Zoom account on the same install (personal + work, for example), instead of overwriting the previous one. See [connections](/connections).
* **content filter chips moved to the top of search results** — the chips that filter search results by content type are now anchored to the top of the results area, so they don't shift around as results stream in. See [search screen history](/search-screen-history).
* **icon-only copy button in notification popups** — the copy button in notification popups is now a clean icon instead of an icon + label, reclaiming horizontal room for the message itself.
### bug fixes
* **Screenpipe Cloud transcription falls back correctly for paid Basic users** — paid Basic plan users hitting the cloud transcription path used to fail back to a less capable lane in some cases. Cloud transcription now falls back on the right tier for your plan.
* **cloud entitlement re-verifies when you refocus the app** — switching networks, waking from sleep, or being away long enough for the token to expire could leave the app in a stale signed-in state. Bringing the window to focus now re-verifies your cloud plan, so chat, transcription, and pipes use the correct tier immediately.
* **chat shows a clear, retryable error when the cloud gateway is unreachable** — when the cloud gateway is down or unreachable, chat now surfaces a clear message with a retry button instead of failing silently or hanging.
* **background pipes don't silently no-op when a tool call streams** — the AI gateway used to drop streamed `tool_calls` chunks in some cases, so background pipes finished without ever executing the tool. Streamed tool calls are now forwarded intact.
* **unread indicators stay consistent across chats, pipe runs, and restarts** — the unread dot would sometimes stick after you'd already read a chat, or clear when you hadn't, especially after switching chats, after a pipe run posted into chat, or after restarting the app. Unread state is now consistent in all three paths.
* **tag search no longer freezes on large databases** — searching by tag on a large memory database used to freeze the UI and sometimes return no results. The query is now indexed properly; tag search is responsive and complete on big DBs. See [search screen history](/search-screen-history).
* **multi-language transcription selection now persists** — picking multiple transcription languages used to reset on relaunch. Your selection now persists across restarts. See [meeting transcription](/meeting-transcription).
* **black / green corrupt frames are dropped, encode dimensions normalized, pasted screenshots accepted** — capture now rejects the all-black / all-green frames some drivers emit on wake or resolution change, normalizes encode dimensions so frames don't get stretched, and the feedback dialog now accepts screenshots pasted from the clipboard.
* **meeting notes editor: resizable images, escaped HTML attributes, harder sync** — images embedded in meeting notes can now be resized in place, HTML attributes are properly escaped (no more broken markup from quotes in transcripts), and the editor state syncs more reliably when you switch notes quickly.
* **pipe runs tab no longer shows duplicate output** — long-running pipes sometimes rendered the same chunk twice in the runs tab. Output now renders once. See [pipes](/pipes).
* **Windows ARM64 build no longer fails with `STATUS_DLL_NOT_FOUND`** — the Windows ARM64 build no longer fails to start because `OPENBLAS_PATH` wasn't being inherited by the build. ARM64 Windows users can install and launch normally.
* **phantom Safari meetings stopped** — Safari page titles that happened to match meeting-detection patterns no longer create phantom meeting notes. See [meeting intelligence](/meeting-intelligence).
* **manual sync surfaces backend errors instead of a false success** — clicking sync used to flash "synced" even when the backend rejected the call. Manual sync now reports the real outcome.
* **"open note" and HD button open the live note** — opening a note from the meeting card or the HD button now opens the live, editable note instead of a stale snapshot.
* **redact: missing target tables are disabled, not retried forever** — if a redaction target table doesn't exist on your install, screenpipe now disables that target instead of retrying it every cycle and filling the log.
* **agent file preview resolves relative paths correctly** — clicking a source citation from the in-app agent (for example `.pi/skills/screenpipe-api/SKILL.md`) used to fail with a "file not found" error because the viewer looked in the wrong directory. The viewer now resolves relative agent paths, falls back across the chat session dir / data dir / home / pipe dirs, and shows the resolved path in the breadcrumb.
* **duplicate deep-link events are ignored** — opening a `screenpipe://` link twice in quick succession no longer triggers two handlers (and two follow-up prompts) for the same action.
## week of june 18, 2026
### new features
* **PII removal on by default for new installs** — new desktop installs now ship with on-device PII removal enabled by default. The lightweight inline redactor scrubs emails, phone numbers, SSNs, card numbers, API keys, and connection strings as text is captured — no large model download, no startup cost. Existing installs keep your current choice. See [privacy filter](/privacy-filter).
* **consistent pseudonym tokens for redacted PII** — an opt-in redaction mode replaces `[PERSON]` / `[EMAIL]` placeholders with stable per-install tokens like `[PERSON_1a2b3c4d]`, so the same value always renders to the same token. Your timeline stays correlatable ("same person mentioned across these meetings") without the raw value ever being recoverable. Toggle under **settings → privacy → fields to redact**. See [privacy filter](/privacy-filter).
* **Slack: post as you, no bot installed** — the Slack connection now uses a user-token OAuth flow, so messages send as you and no bot user is added to the workspace. Pick **send only** or **send + read** at connect time. Existing webhook-based connections keep working until you reconnect. See [connections](/connections).
* **browse and install MCP servers from the official registry** — the **custom MCP server** card in **settings → connections** now has a **browse registry** button that searches the official MCP registry, shows remote / local / catalog badges, and one-click pre-fills the existing add / auth / test / save editor. See [connections](/connections).
* **browse and install Agent Skills from a curated registry** — the Skills card now has a **browse skills** dialog backed by a curated catalog (Anthropic + OpenAI skills: pdf, xlsx, docx, pptx, transcribe, playwright, sentry, …). Picking a skill downloads it atomically into your skills folder. See [connections](/connections).
* **Obsidian as a memory-sync destination** — alongside Claude Code (`CLAUDE.md`) and Codex (`AGENTS.md`), screenpipe can now sync memories into an Obsidian vault as a single screenpipe-owned note with YAML frontmatter and tags, rewritten every 5 minutes so memories live inside your Obsidian graph. Enable on the Obsidian connection card. See [connections](/connections).
* **clickable source citations in chat open a unified preview sidebar** — clicking a source card under a chat answer (e.g. "Read: SKILL.md") now opens that file in the right-hand markdown preview sidebar instead of being dead text. Code blocks across chat and the preview share one theme-aware highlighter (light + dark) with a copy button.
* **token-efficient `format=outline` for the element APIs** — `/elements` and `/frames/:id/elements` now accept `?format=outline` (alias `tree`), returning an indented, dedup'd view that keeps only text-bearing nodes, collapses repeats as `×N`, hoists frame context into a header, and flags off-screen elements inline. Roughly 75–80% fewer tokens than the default JSON when an agent pastes the response into context. Existing callers without the param get the exact same JSON. MCP `search-elements` and `get-frame-elements` use this format by default. See [API recipes](/api-recipes).
* **deterministic browser snapshot + `/act` endpoint** — the browser snapshot now stamps every actionable element with a stable `#eN` ref (Playwright-MCP style) and reports inline state (`disabled` / `checked` / `expanded`). A new `POST /connections/browsers/:id/act {ref, action, value?}` endpoint runs `click` / `fill` / `clear` / `check` / `uncheck` / `select` / `hover` / `focus` against that ref. Works against both the Chrome extension and the built-in browser; React/Vue controlled inputs register correctly. See [API recipes](/api-recipes).
* **meeting summarizer can read visual content via the cloud media model** — after the transcript and OCR pass, the in-app **summarize with AI** flow and the background meeting-summary pipe can optionally send up to four keyframes to the cloud media model, so diagrams, charts, whiteboards, slide figures, UI demos, and screen-shared video make it into the summary. Falls back cleanly when cloud media analysis isn't available. See [meeting intelligence](/meeting-intelligence).
* **remote in-app announcements** — screenpipe can now show a one-time announcement (news, tip, or reminder) as a centered modal, a top / bottom banner, or a small corner card. Each announcement is dismissed per-id and never returns.
### updates
* **interactive chat auto-routes to a fast model; background to a smart one** — the **auto** preset now picks a fast model (\~1s first token) for interactive chat and a higher-reasoning model for background work (pipes, suggestions, daily summary). Vision turns are unaffected. Net result: chat feels faster, background quality goes up.
* **redesigned pipe cards** — every pipe in **my pipes** is now an obviously openable card with a clear primary action; the dead status square and bare-dash filler are gone. See [pipes](/pipes).
* **built-in browser runs headless for background pipes** — scheduled pipes that drive the built-in browser no longer fail when the browser sidebar isn't open. The webview is lazily created off-screen, scrapes return real results, and revealing the sidebar adopts the same instance. Background scrapes never paint over your current view on Windows.
### bug fixes
* **don't sign-out or stop recording on a transient cloud-token blip** — a transient secret-store read failure used to read as "no account / no plan", stop recording mid-meeting, and show the sign-in wall (flapping on every settings change). The entitlement gate now stays open for an account we have evidence was entitled, keeps recording, and self-heals once the token comes back. A real sign-out is unchanged.
* **enterprise sign-in no longer gives up after one check** — for enterprise members whose plan is still being provisioned at sign-in (eager invite, lazy upgrade, admin re-invite, Stripe webhook in flight), the entitlement gate now re-verifies in the background for up to \~7 minutes instead of stranding you behind the wall. The moment the backend entitles you, the app unlocks and capture resumes — no relaunch, no manual refresh.
* **fewer "database disk image is malformed" / "database locked" cases** — secret-store reads (cloud token, OAuth refresh, keychain toggles, ChatGPT pipe token) used to open and drop their own connection pool against the same database the engine writes to, racing engine writes. The secret store now shares one process-wide pool with matching settings and a warm persistent connection.
* **meetings end correctly when they go quiet** — a detected meeting that lost its call-control UI (call ended, window minimized, tab switched) could stay "ongoing" forever because the system-audio output tap writes silent chunks continuously. The keep-alive now requires real voice activity, so a quiet call ends after the normal grace and the note's end time and auto-summary fire. Genuinely audible screen-shares stay alive as before. See [meeting intelligence](/meeting-intelligence).
* **chat tag autocomplete and `/memories?tags=…` no longer 500** — a single memory row with empty, NULL, or non-JSON tags used to make the tag query throw `malformed JSON` and kill every tag autocomplete call (observed firing \~14.8k times/day on a real install). Malformed rows now expand to nothing instead of erroring. See [search screen history](/search-screen-history).
* **Microsoft 365 and Teams connect works again** — Microsoft Entra had been rejecting the OAuth call with `AADSTS90023 Unsupported 'prompt' value`. Microsoft endpoints now send a single `select_account` value, which still shows the account picker and prompts for consent on first connect. See [connections](/connections).
* **built-in browser eval results larger than \~1KB no longer get truncated** — the agent's "navigate and read the page" path used to silently truncate large results into invalid JSON, so reading basically any real page failed. Large results now stream back as base64 chunks and reassemble intact.
* **built-in browser navigations show up in the right chat** — when the in-app agent navigated the built-in browser for the on-screen chat, clicking to open the sidebar sometimes showed nothing because the navigation event was tagged with a session id that didn't match the chat's current state. The sidebar now also accepts the session id the chat's own agent runs under. Other chats and background pipes stay isolated.
* **DRM detection covers the native Apple TV app** — the macOS Apple TV app reports its name as just "TV", which didn't match the old "apple tv" pattern, so screenpipe kept recording DRM video from it. "TV" is now matched exactly (no false-positives on names like "Plex TV" or "3ds Max").
* **Windows installer no longer aborts with "unable to uninstall"** — the pre-uninstall hook's process-kill scan was killing the live uninstaller process itself. It now skips the running uninstaller while still terminating every other app process.
* **meeting-summary pipe note updates save again** — the meeting-summary pipe and the in-app summarize fallback were calling the notes endpoint with the wrong HTTP verb, so saves were 404'ing. They now use the correct verb, and an idempotent migration fixes already-installed copies of the pipe without touching your other edits. See [pipes](/pipes).
* **meeting "copy" uses the native clipboard API** — copying a meeting transcript / summary now uses the standard clipboard API path and works reliably across the app. See [meeting intelligence](/meeting-intelligence).
* **Windows desktop build restored** — a transitive dependency had broken the Windows DirectML build chain; the desktop app and release builds compile and ship again on Windows.
* **`/stream/frames` and remote-frame payloads expose a neutral `text` field** — both wire surfaces still labelled the captured screen text as `ocr_text`, even though most captures are accessibility-derived, not OCR. They now carry a neutral `text` field; `ocr_text` is kept as a deprecated alias so existing stream consumers don't break. See [API recipes](/api-recipes).
## week of june 17, 2026
### new features
* **screenpipe-cloud transcription for every paid plan, plus a meetings-only capture mode** — screenpipe-cloud transcription now defaults on for Basic, Business, Enterprise, and Lifetime users on macOS, Windows, and Linux (not just macOS / cloud-subscribed). New desktop installs also default to a new **meetings-only** audio capture mode that only persists and transcribes audio while a meeting is active — quiet hours don't fill your timeline. Existing installs keep their current "always capture" setting; switch in **settings → recording**. See [meeting transcription](/meeting-transcription).
* **MCP can create and run pipes** — the screenpipe MCP server (used by Claude Desktop and other MCP clients) now exposes `create-pipe`, `list-pipes`, `run-pipe`, and `pipe-logs` tools, plus a `screenpipe://guide/pipes` resource with the canonical pipe-creation guide (frontmatter, schedule syntax, presets, lifecycle). Agents can author scheduled automations end-to-end over MCP. See [MCP server](/mcp-server) and [pipes](/pipes).
* **native Zendesk OAuth** — the Zendesk tile in **settings → connections** now supports a one-click "Connect with Zendesk" OAuth flow per subdomain. Manual email + API token entry stays as a fallback. See [connections](/connections).
* **one-click "open note + HD" on the meeting notification** — the meeting-detected notification's two adjacent buttons collapse into a single **open note + HD** action that opens the live note and starts HD capture together. The standalone **open note** button stays for users who only want the note. Gated by the existing HD default = "Ask me" setting. See [meeting intelligence](/meeting-intelligence).
* **redesigned pipes list with run / edit / remix** — each pipe is now a brand-aligned card with an always-visible action bar (run, edit, remix, more, enable). **Edit** opens a chat to tweak the pipe in plain English (was hidden in a hover-only menu); **remix** creates a new pipe based on this one without mutating the original. See [pipes](/pipes).
* **discoverable pipe creation from the empty state** — the "no pipes installed" state now leads with one-click example chips that build a pipe through the generation flow, and the bottom create input is a titled, explained "create your own pipe" box with a clear submit arrow. See [pipes](/pipes).
* **resizable live transcript panel in meeting notes** — drag the grip on the top of the live meeting transcript drawer to shrink it (down to 120px) or grow it (up to 70vh). Double-click resets to the default; arrow keys nudge it; chosen height persists across sessions. See [meeting intelligence](/meeting-intelligence).
* **richer pipe alert notifications** — pipe-emitted notifications now include a copy button and source links so you can grab the alert text or jump straight to its source from the toast.
### updates
* **meeting summarizer also reads the screen (OCR)** — the in-app meeting summary and the background summary pipe now query OCR alongside transcripts, so slide content, on-screen documents, demos, and on-screen name tags (handy for naming attendees who never spoke) make it into the summary. See [meeting intelligence](/meeting-intelligence).
* **chat tag and speaker filters scale and search** — the tag and speaker pickers in chat now stay snappy with large lists and support inline search, including in the standalone chat window.
* **enterprise build registers its own deep-link scheme** — the enterprise desktop app now registers `screenpipe-enterprise://` instead of sharing `screenpipe://` with the consumer build. On machines with both installed, login and calendar deep links route to the build that initiated them instead of whichever Launch Services picked. Consumer scheme is unchanged.
### bug fixes
* **fewer transcription crashes during long meetings** — fixed the recurring `compute_fbank` panic that dropped speaker diarization for a segment when speech was shorter than one 25 ms analysis window, and chunked the macOS Metal (Parakeet MLX) transcription path to 30 s so a single bad chunk no longer kills an entire batch's transcript. Both were top transcription errors in the field. See [meeting transcription](/meeting-transcription).
* **screen capture during meetings no longer gets deduped away** — when a meeting is detected, visual-change triggers (slide advances, screen-share, demos) now bypass the accessibility-tree dedup that was silently dropping them, so shared screens are actually captured at the visual-change cadence instead of falling back to one frame every 30 s. Normal-desktop capture is unchanged.
* **transcripts appear in the timeline during static-screen meetings** — when a video call's screen barely changes and screenshots get deduped for minutes, transcripts now appear at the audio's own moment in the timeline (as an audio-only entry) instead of being attached to a distant frame or, with screen capture off, dropped entirely. The stretch becomes a scrubbable, transcript-bearing segment. See [search screen history](/search-screen-history).
* **orphaned audio chunks are recovered automatically** — when the database write pool was saturated, audio files could land on disk with no matching audio-chunks row, never appearing on the timeline and never being transcribed. A reconciliation sweep now durably re-inserts dropped chunks once the write pool recovers, so they show up and get transcribed. See [meeting transcription](/meeting-transcription).
* **timeline jumps from chat sources and deep links land on the right moment** — clicking an "open in timeline" citation, an inline chat timestamp link, a `screenpipe://` timeline/frame deep link, or a meeting-notes replay strip now jumps to the captured moment whether it's same-day or cross-day, instead of no-op'ing same-day or landing at the start of the target day. See [search screen history](/search-screen-history).
* **recording auto-restarts when the database write queue wedges** — sustained disk-I/O write wedges (which used to leave the recorder silently stuck for 10–15 minutes while the tray still showed "healthy") now auto-restart the recording engine, with a circuit breaker so a genuinely malformed database can't restart-storm. The write-ahead log also gets periodic checkpoint maintenance in the desktop app, which previously only ran in the standalone CLI — preventing the unbounded WAL growth that drove much of this corruption class.
* **sidebar and recording buttons clickable on a collapsed timeline** — fixed an overlay bug where the sidebar and recording controls became unclickable when the timeline was collapsed.
## week of june 16, 2026
### new features
* **reasoning effort control in chat** — the chat composer now has a Brain-icon selector to pick low / medium / high reasoning effort, and it works across every preset provider (screenpipe-cloud, ChatGPT, Anthropic, OpenAI BYOK gpt-5 / o-series, native Ollama thinking models, and custom OpenAI-compatible endpoints). The control self-disables on models that don't support thinking, and the saved level is reapplied on every cold start so Pi reasons at your chosen level from the first turn.
* **token-efficient API responses for agents** — `/search`, `/elements`, and `/frames/:id/elements` now accept opt-in `?format=csv` / `?format=tsv` and `?fields=...` parameters, returning a columnar table with just the columns you ask for. Cuts roughly 70% of tokens on list-shaped results when an agent (Pi, Claude Code, Copilot CLI, …) pastes the response into context. Fully backward compatible: no params returns the exact same typed JSON. See [API recipes](/api-recipes).
### updates
* **flatter PII worker CPU curve** — the on-device PII redaction worker used to drain its backlog in back-to-back bursts that could spike screenpipe to 200%+ CPU for a few seconds at a time. The worker now runs on a duty-cycle cooldown that holds it to at most \~40% of wall-clock and caps each text-model burst near 2 cores, so the same backlog drains as a low flat band instead of a visible spike. No behavior change to what gets redacted. See [privacy filter](/privacy-filter).
* **lower idle CPU and allocations across capture, scheduling, and monitoring** — a sweep of small steady-state wins for 24/7 capture: cached accessibility app-exclusion filters, reused UI-event window filtering, reused audio RMS computation, throttled audio-gap warnings, gated analytics timers, relaxed events-websocket ping cadence, backed-off missing-input recovery probes, and removed per-tick allocations in the pipe scheduler, schedule monitor, permission monitor, resource monitor, and workflow classifier. No behavior change — just less work per second on the hot path.
* **owned-browser sidebar now shows navigations from the pipe you're watching** — pipe runs now tag their owned browser sessions with a stable `pipe::` id that matches the frontend's session id, so when you open a running pipe its sidebar correctly streams that run's browser navigations. Unrelated chats still don't see background pipe traffic.
### bug fixes
* **Windows audio engine no longer hangs at boot** — on both Windows x86\_64 and Windows ARM64, the ONNX Runtime upgrade in the previous release could deadlock inside the audio engine's runtime load, freezing the `building_audio` boot phase forever — the UI came up but recording, VAD, and diarization never started and port 3030 never bound. The audio engine now links ONNX Runtime at build time on Windows instead of loading it dynamically, and a 30-second watchdog around session init means any future runtime hang degrades gracefully (diarization off, fallback VAD) instead of bricking startup. See [meeting transcription](/meeting-transcription).
* **chat keeps streaming when you open Settings** — opening **Settings** mid-response no longer pauses or drops the in-flight chat stream; it continues in the background and the tokens are all there when you switch back.
* **actionable Ollama errors before the Pi install prompt** — when chat is pointed at a local Ollama endpoint that isn't reachable (Ollama not running, wrong port, model not pulled), the composer now surfaces the specific Ollama error first instead of jumping straight to "install Pi?", so the fix is obvious.
* **Account page no longer shows "active" plan under a "not logged in" header** — if the encrypted cloud token failed to hydrate (keychain denied, secret store cleared), the Account settings page could simultaneously render "not logged in" and a "Screenpipe Business · active" card because the card was keyed off a plaintext subscription flag. The active-plan card now requires a live session token to match the header, and the inconsistent state can no longer be persisted to disk.
* **Vertex Gemini tool calls stop 400-ing for affected users** — assistant tool calls coming back from Vertex MaaS without ids are now backfilled and re-paired with their matching tool results, fixing a recurring 400 from the AI gateway (SCREENPIPE-AI-PROXY-C) for \~164 users. No-op for healthy traffic.
* **no more PostHog event storm after the machine wakes from sleep** — the analytics loop was firing \~100× too often (every \~216 s instead of every 6 h) and replayed every missed tick back-to-back when the machine resumed from a long sleep, producing roughly a thousand failing requests in a burst. The interval is correct again and missed ticks now coalesce into a single tick on resume.
* **bare-CLI usage no longer overcounts users** — running `screenpipe` from the terminal minted a fresh random analytics id on every process start, inflating CLI / Linux / Windows user counts \~1.6–2× versus distinct IPs. Bare-CLI runs now use the same persistent per-machine id the sync layer already uses, so a restart is the same user. Desktop app counts were unaffected. Forward-only: historical counts will compress toward true values as the new CLI rolls out. See the [CLI reference](/cli-reference).
## week of june 15, 2026
### new features
* **bring-your-own MCP servers in pipes** — pipes can now call the same custom HTTP MCP servers you've wired up in **settings → connections** (Brave Search, Linear, Notion, internal company MCPs, …), not just chat. Tools resolve through the existing connection so credentials stay in the secret store. See [pipes](/pipes) and [connections](/connections).
* **dismiss chat suggestions, calmer composer layout** — a single inline X on the chat composer hides both the follow-up questions and the connection-suggested prompts in one click, with a new **settings → display → show chat suggestions** toggle to bring them back. The `+` attachments / filters control and the model dropdown have also moved into their own row under the input box, so the text box itself only holds your prompt (Claude-style).
* **CLI-specific feedback survey** — `screenpipe survey` and the periodic in-CLI nudge now open a CLI-dedicated survey (tagged with your CLI version and OS) instead of the generic one, so terminal-only feedback is no longer lumped in with the desktop app. See the [CLI reference](/cli-reference).
### updates
* **lighter audio dedup and memory sync on the hot path** — the "is this transcription a near-duplicate of the last 50?" check used to re-tokenize the incoming chunk on every comparison (24/7 while recording), and the memory sync was cloning every memory UUID into an owned set just to read it. Both paths now normalize once and reuse, cutting steady-state CPU and allocations during long recording sessions with no behavior change. See [meeting transcription](/meeting-transcription).
### bug fixes
* **PII redactor no longer false-flags strings like `x@y.c|m` as emails** — the on-device email pattern had `[A-Z|a-z]` in the TLD class, which (inside a character class) treats `|` as a literal character — so any "almost-email" with a pipe in the TLD was detected as an email and redacted. Pattern is now `[A-Za-z]`; real email detection is unchanged. See [privacy filter](/privacy-filter).
* **Windows installer no longer fails on locked files during upgrade** — the NSIS pre-install / pre-uninstall hooks now share a hardened process-kill macro (UTF-16+BOM PS1 for non-ASCII install paths, WOW64 redirection disabled so `System32` resolves to the real 64-bit PowerShell, 30 s timeout so the installer can't hang, longer post-kill settle). Upgrades on systems where the old `screenpipe.exe` is still alive now succeed instead of aborting mid-install.
* **Windows ARM64 build restored** — a Rust dependency bump silently broke the Windows DirectML compile path, so the previous release (v2.5.38) shipped without a Windows ARM64 binary. The build is back; Windows ARM64 users get auto-updates again.
## week of june 14, 2026
### new features
* **background AI traffic routes through Gemini flex tier (\~50% cheaper)** — latency-tolerant traffic (pipes, daily summary, suggestions, background chat) can now opt in to Gemini's flex tier for roughly half the input/output price at comparable quality. Interactive chat is unaffected, and the gateway transparently falls back to standard-tier models if flex is throttled. Cost is attributed to the flex variant in your usage view so the discount shows up in dashboards.
* **separate notification toggle for power-mode changes** — **settings → notifications** now has its own **Power mode changes** switch so you can silence the "battery saver kicked in" toast without also muting capture-stall alerts. Critical low-battery capture-paused alerts still fire either way.
### updates
* **extra cloud AI preset copies can be deleted** — Pro users with duplicated or imported screenpipe-cloud presets can now delete the extras. Only the last remaining cloud preset is still protected from deletion, so you can't accidentally lock yourself out of cloud models.
* **GPT-5.5 models added to the OpenAI preset fallback list** — `gpt-5.5` and `gpt-5.5-codex` are now selectable in the OpenAI preset when model discovery falls back to the built-in list. Also cleans up a duplicate ChatGPT preset that could appear on first launch.
### bug fixes
* **PII redaction now covers the main search index** — the async PII reconciliation worker was rewriting redacted text in OCR, transcripts, accessibility text, UI events, and per-element text, but missed the consolidated full-text column that backs screenpipe's primary search index. Raw PII was gone from component columns but still searchable. That column is now redacted on the same pass and the search index re-indexes automatically. See [privacy filter](/privacy-filter).
* **clearer errors when the bundled pi coding agent fails to install** — if the embedded pi agent failed to install (for example, when `bun` crashed on an unsupported CPU or was killed by the OS), the resulting error message was sometimes completely empty, leaving chat silently broken. Install failures now report the exit code or signal, tails of both output streams, and the bun version and command line, so failures are diagnosable from the log alone.
* **no more per-minute 500 errors when calendar providers aren't connected** — when no calendar provider was connected (no Google account linked, or no OS calendar permission), the home window's 60-second calendar poll was logging two HTTP 500s every minute, forever. Not-connected is now a normal empty response instead of a server error, and missing OS permission returns a structured auth-required response. See [connections](/connections).
* **macOS standalone chat window no longer overlaps the traffic-light buttons** — added left padding to the chat header in macOS standalone mode so the title and controls clear the red/yellow/green window buttons.
### new features
* **keep computer awake while recording** — a new toggle in **settings → recording** keeps the machine awake so capture and pipes keep running when you'd normally see the screen sleep. Lives in the power settings group with copy that spells out exactly what it holds open.
* **apply & restart bar in settings** — recording, privacy, and storage settings now show a full-width floating bar at the bottom of the page when there are unsaved changes that need a restart, so it's obvious when you've changed something and what to do next. Changing the data directory now also actually restarts the capture engine.
* **tag filters in chat** — the chat composer now has a tag picker that unions screen, audio, and memory tags into one suggestion list. Typing `#` opens tag-only suggestions, sections collapse when empty, and each suggestion shows where it came from (frames, audio clips, memories). See [search screen history](/search-screen-history).
* **device connection suggestions in chat composer** — the composer now surfaces connection chips for the integrations you have wired up, so kicking off "ask Notion…" or "ask Linear…" is a single click. See [connections](/connections).
* **notification bell moved into the Pipes view** — notifications are pipe output, so the bell now lives in the Pipes view tab bar (next to **My Pipes** / **Discover**) instead of the global top-left chrome strip. The chrome strip is reduced to sidebar toggle, search, and recording status. See [pipes](/pipes).
### updates
* **default AI preset is now "auto" instead of `claude-opus-4-8`** — new installs and first-time pro sign-ins get the default chat preset on **auto** (the gateway picks the best allowed model per turn) instead of pinning Claude Opus 4.8. Existing installs are unchanged.
* **AI gateway caches conversation history (\~80% cheaper agentic turns)** — long agentic conversations now cache the entire conversation prefix per turn, not just the system prompt, so each follow-up re-reads prior history at roughly 0.1× input price on Claude, GPT-5, and Gemini 2.5. Usage telemetry attributes cache reads and writes correctly, so dashboards reflect the real cost.
* **cost log attributes the served model, not "auto"** — `auto` and fallback requests now log the model that actually served the turn (read from the gateway's response header) instead of the literal string `auto`. Per-model spend in your usage view is now accurate and previously-flat `$0.01` unknown-model estimates are gone.
* **lower Windows background CPU** — cached focus-monitor rectangles, fewer idle hook timer wakeups, no first-frame polling on Windows Graphics Capture, and a cached audio-input STT device name cut quiet-time CPU on Windows without changing capture behavior.
* **lighter meeting detector on hot paths** — the meeting/browser detector no longer re-lowercases the same app names on every check, trimming a small but constant background cost during long sessions.
* **artifacts API converged under `/artifacts`** — local pipe outputs and cloud artifacts now share one API surface and one renderer, so a pipe-authored SOP and a cloud SOP look the same in the Brain section. Legacy `/outputs` and `/pipes/artifacts` routes are gone; pipes built against them should switch to `/artifacts`. See [API recipes](/api-recipes) and [pipes](/pipes).
### bug fixes
* **Linux auto-update works again** — Linux clients had been failing auto-update with "signature verification failed" since March because the AppImage was repacked after the updater signature was generated. The post-repack re-sign step is back, so Linux users stuck on older builds will pick up updates again on next check.
* **OCR works on Linux without a system tesseract install** — the Linux AppImage now bundles `eng.traineddata` and resolves it from inside the bundle. On hosts without `tesseract-ocr` installed, screen text is indexed again instead of being silently dropped.
* **capture restarts when it silently wedges** — if disk I/O stalled long enough that the database write queue saturated, capture could appear "Running" in the tray while persisting nothing for an hour or more. A new watchdog now restarts the capture engine when the loop is still attempting frames but nothing has been written for over two minutes (with a 5-minute cooldown so it can't loop).
* **no more rare macOS audio crashes during long sessions** — fixed a use-after-free in the macOS Process Tap audio path where a CoreAudio callback could fire on freed memory during teardown, and closed a remaining grace-window race in the same path. Long live-meeting sessions are stable again on macOS.
* **embedded `pi` agent no longer touches your global `~/.pi/agent`** — screenpipe's bundled pi coding agent now stores its config, credentials, sessions, and extensions under the screenpipe data directory instead of your standalone pi install. It also prefixes bundled tool names so a globally-installed extension like `pi-web-access` no longer collides with the bundled `web_search` tool and kills the pipe at startup. See [pipes](/pipes).
* **PII redaction now covers per-element accessibility text** — the async PII redactor was rewriting OCR, transcripts, accessibility text on frames, and UI events, but skipped the per-element accessibility/OCR table, so raw element text kept PII verbatim and stayed queryable. That column is now redacted with the same destructive overwrite pattern. See [privacy filter](/privacy-filter).
* **multiple chat state fixes** — rapid clicks on **New chat** no longer create duplicate empty rows; switching between chats restores the correct model/preset for each; "ghost" chats and a stuck loading state after sending a message are gone; and owned-browser navigation events no longer leak into the wrong chat when you switch quickly.
* **broken replay frames are hidden in meeting notes** — replay frames with missing image data no longer show up as broken placeholders in meeting notes. See [meeting intelligence](/meeting-intelligence).
* **meeting notes no longer get clipped in narrow windows** — fixed a layout bug where long meeting titles or attendee lists could overflow the home content pane and get clipped at the window edge (most visible in macOS split screen with the sidebar open). The pane now shrinks correctly and rows truncate as intended. See [meeting intelligence](/meeting-intelligence).
* **sidebar no longer overlaps the icon strip in macOS fullscreen** — fixed a regression where sidebar content could overlap the top-left icon strip when the app was in macOS fullscreen, plus alignment fixes between sidebar nav items and top bar icons.
* **scheduled pipes pick the right weekday again** — fixed a weekday-to-number mapping bug in the human-readable schedule parser so days like "Mon" map to the correct cron weekday and scheduled pipes fire on the days you actually picked. See [pipes](/pipes).
* **Brain artifacts list scrolls smoothly with many artifacts** — the Brain section now uses a full-height layout so virtual scrolling engages, and the redundant outer scrollbar and excessive bottom padding are gone.
* **pipe artifacts list hides implementation files** — when a pipe doesn't explicitly declare its artifacts, the fallback scanner now only surfaces user-facing files (Markdown documents and common image formats) instead of `.DS_Store`, `.json`, `.ts`, and log files. See [pipes](/pipes).
* **custom vocabulary bulk-import button uses the right icon** — the bulk-import button in custom vocabulary now uses a download icon (data coming into the app) instead of an upload icon, matching standard import conventions. See [meeting transcription](/meeting-transcription).
* **daily cost cap no longer trips D1 CPU limits** — the cloud AI gateway's per-device daily-cost cap is now an O(1) lookup against a running daily total, instead of summing the full cost log on every request. Heavy users no longer see request failures attributable to "D1 DB exceeded its CPU time limit" during high-volume agent loops.
## week of june 12, 2026
### new features
* **native macOS login sheet** — signing in now uses Apple's `ASWebAuthenticationSession`, a sandboxed Safari sheet anchored inside the screenpipe window, instead of bouncing you out to the system browser and back through a deep link. Faster, no window jumping, and the app re-focuses cleanly after auth.
* **HubSpot connection — one-click OAuth** — the HubSpot tile in **settings → connections** now uses a one-click OAuth flow (contacts, companies, deals — read + write) instead of a manual Private App token. Existing token-based connections keep working, and the manual token is still available behind an advanced disclosure. See [connections](/connections).
* **meeting note editor — slash commands, format toolbar, task lists, and a live waveform** — the meeting note editor picks up a `/` slash command menu, a selection-based format toolbar, GitHub-flavored task lists (markdown round-trip), per-segment transcript timestamps with inline search highlighting + match counter (cmd+F), and a monochrome "dancing sticks" waveform replacing the static mic icon on every live surface. See [meeting intelligence](/meeting-intelligence).
* **decluttered sidebar chrome** — the sidebar corner collapses from 13 elements across three rows into a single 4-element strip: collapse, search, a recording-status dot (with a popover for per-device pause/resume and meeting start/stop), and the notification bell. Collapsing the sidebar now hides it entirely instead of leaving a 72px icon rail, so content gets the full window.
* **team-shared pipes show up in the Cloud tab** — pipes shared to your team from the desktop app now appear in the cloud-pipes list alongside dashboard-published pipes, each tagged with a source badge so you can tell them apart. See [pipes](/pipes).
### updates
* **cheaper, faster auto-routing for agentic work** — the AI gateway's auto waterfall now picks `glm-5` as the primary model for non-vision turns (roughly 3× cheaper on output than the previous default at comparable quality). Vision requests still route through the prior vision-capable head, so screen-aware turns are unaffected.
* **model-aware transcription language list** — the language picker in **settings → recording** now only offers languages your selected transcription model actually supports, instead of showing every language and silently falling back at runtime. See [meeting transcription](/meeting-transcription).
* **lower CPU during live meetings** — the live-meeting audio path now reuses a single resampler per stream instead of rebuilding the filter bank every \~20 ms, cutting a large chunk of background CPU during long calls with no change to transcript quality. See [meeting transcription](/meeting-transcription).
* **redesigned pipe connection picker** — the per-pipe connection picker has a cleaner layout that makes it easier to see which integrations a pipe will use and to wire up the right ones in one pass. See [pipes](/pipes).
* **smoother desktop feedback follow-up** — the in-app feedback flow has a tighter follow-up UX so replies from the team land in a clearer thread instead of a flat list.
### bug fixes
* **a second Google account no longer wipes the first** — connecting a second Google Calendar or Docs account used to silently overwrite the token for the first account because both lived in a shared default slot. Each account is now stored under its own named slot, and a startup sweep promotes any account still parked in the legacy slot so existing installs heal on next launch. See [connections](/connections).
* **all Google Calendar accounts appear everywhere** — after connecting a second Google account, the 60-second calendar poller, live meeting notes, pipes, and chat tools would 401 with "multiple accounts connected, pick one" and calendar looked disconnected. Calendar reads now merge events across every connected Google account (deduped by event id) and the connection-status check counts any healthy account. See [connections](/connections).
* **HubSpot, Notion, and other connections survive a transient keychain hiccup on Windows** — a one-off failure to read the encrypted settings file (`store.bin`) at startup used to be silently swallowed and treated as a fresh install, which then saved defaults over your real settings (reported on Discord as "Windows update deleted all my AI models"). Transient keychain reads are now retried, unreadable encrypted blobs are restored from the newest healthy snapshot (with the ciphertext preserved as a backup), and an encrypted blob is never overwritten by a fresh-install save.
* **enterprise sign-in gate and pi token cleanup** — fixed two enterprise login edge cases that could leave the account in an inconsistent state after sign-out: the login gate now blocks the right paths, and stale `pi` tokens are cleared on sign-out so the next sign-in starts from a clean slate.
* **Todoist connection validates again** — the connection test was parsing the Todoist v1 projects endpoint as a bare array, but v1 returns a cursor-paginated object, so valid tokens were rejected with "error decoding response body". Validation works again. See [connections](/connections).
* **`/v1/web-search` works again** — Google withdrew `gemini-2.0-flash` from Vertex, and the pinned web-search head started returning 404 on every call. Web search now routes through the GA `gemini-flash` alias.
* **no more black browser tabs titled "screenpipe/screenpipe"** — the bundled "screenpipe" ignore pattern matched both app names and window titles, so any browser tab with "screenpipe" in its title was treated as self-capture and rendered black in your history. The pattern is now scoped to the app name only, and existing installs are migrated automatically.
* **no more false "audio stalled" warning during live meetings** — fixed a case where the live meeting capture would surface a spurious "audio stalled" warning while audio was actually flowing. See [meeting transcription](/meeting-transcription).
* **meeting note drafts save reliably** — fixed a race where typing into a meeting note draft could lose the most recent edit if you navigated away quickly. Drafts now flush cleanly on navigation. See [meeting intelligence](/meeting-intelligence).
* **"recents" in chat sort by your last message, not the chat's creation time** — the recents list now derives each conversation's age from the latest user message timestamp, so chats you've recently revisited bubble back to the top instead of sinking by creation date.
## week of june 11, 2026
### new features
* **Excalidraw connection** — a new tile in **settings → connections** lets the agent read and create Excalidraw+ workspaces via an API key. Validated on save, stored in the secret store, and removed cleanly on disconnect. See [connections](/connections).
* **Plaud connection** — a one-click OAuth tile in **settings → connections** lets the agent pull meetings and recordings from Plaud. See [connections](/connections).
* **Mochi flashcards connection** — a new connection for the Mochi spaced-repetition service. The agent can read and create cards through the credential proxy, so your API key never reaches pipes or the model. See [connections](/connections).
* **redesigned connections page** — **settings → connections** is grouped into clear categories with an updated layout, so finding (or discovering) an integration is a lot faster. See [connections](/connections).
* **team pipe sharing** — team admins can share a pipe with their team from the desktop app. Recipients get the pipe with auto-update on new versions while keeping their own on/off choice; new installs arrive off and read-only, and "fork to edit" detaches a copy from auto-updates. Unshare propagates and disables (never deletes) marked copies. See [pipes](/pipes).
* **artifacts library for chat and pipes** — a unified Brain section that lists every output your pipes and chats have generated, with in-app markdown and text previews, batch select, and a viewer window for inspecting individual files. See [pipes](/pipes).
* **filter screen, audio, and memories by tag** — `/search` and the MCP `search-content` tool now accept a comma-separated `tags` filter that matches across screen, audio, and memories with exact-AND semantics. Namespaced tags like `person:`, `project:`, `topic:` link captures to facts so you can pull every moment tied to a person or project in one query. Index-driven (≈7 ms at 200k frames). See [search screen history](/search-screen-history) and [API recipes](/api-recipes).
* **searchable settings** — a fuzzy search bar at the top of settings jumps you straight to the matching field (and scrolls to it), with deep matching against sub-settings.
* **smooth HD playback in the timeline** — when scrubbing through an HD chunk, the timeline now plays it at native framerate (10/30 fps) instead of stepping one frame per second. Motion looks smooth while audio and the slider stay in sync. See [search screen history](/search-screen-history).
* **clickable source citations in chat** — Ask answers now make screen, activity, and meeting citations clickable: tapping one jumps into the timeline at the captured moment instead of leaving you with inert text.
* **"Try in Chat" connection chips** — clicking a connection prefills the chat composer with a connection chip that scopes the message to that integration, so kicking off "ask Notion…" or "ask Linear…" is a single click. See [connections](/connections).
* **HD recording confirmation toast** — clicking **+ HD** on a meeting notification now posts an in-app confirmation that HD capture actually started, instead of being silent. See [meeting intelligence](/meeting-intelligence).
* **Claude Fable 5 in model pickers** — the new Anthropic Claude Fable 5 model is available across the screenpipe-cloud picker, the BYO-key Anthropic picker, and the static AI-preset selector.
* **native drag-to-grant permissions flow on macOS** — onboarding now uses a native drag-to-grant panel for macOS permissions instead of a click-through. The panel auto-dismisses once a permission is granted (including manual toggles), recovers from stale TCC entries, and surfaces a clear "permission needed" cue if capture is blocked at startup. See [permissions](/permissions).
* **Getting started tutorial card in Help** — the Help section now leads with a Getting started tutorial card that opens the full screenpipe walkthrough video, giving new users an obvious entry point.
* **smaller, faster local PII redaction model** — the on-device text redactor drops from 266 MB to 149 MB (vocab-pruned v45\_phase5) with identical detections on names, emails, phones, SSNs, and persons. Lower memory footprint for the redact worker; the deterministic detector backstops structured PII regardless. See [privacy filter](/privacy-filter).
* **PII redaction runs on the Apple Neural Engine** — the on-device PII model now runs on ANE/NPU instead of CPU on supported Macs (\~3.4× faster, much lower power). See [privacy filter](/privacy-filter).
* **API + CLI skill packs in agent cards** — the Hermes and OpenClaw skill tabs now offer both `screenpipe-api` and `screenpipe-cli` skills behind an API/CLI switcher, so agents can pick the surface that fits the task. See [connections](/connections).
### updates
* **scheduled pipes show readable day labels** — the schedule picker now parses human-readable schedules and renders the selected days and tooltips in plain English, instead of raw cron fragments. See [pipes](/pipes).
* **automatic fallback model when the main preset fails** — if a pipe's main model times out or errors, the run is retried against the configured fallback preset instead of failing the whole pipe. See [pipes](/pipes).
* **clearer AI gateway errors** — model routing now returns a clear, actionable error when a model is broken or missing (instead of a bare 404), and missing-`model` / missing-`messages` cases return readable messages instead of crashing.
* **actionable audio model-download errors on corporate networks** — when the audio model download is blocked by a proxy or corporate firewall, screenpipe now surfaces the actual cause and what to allowlist, instead of failing silently.
* **lighter background CPU on macOS and Windows** — quieter idle polling for the activity, UI recorder, and event-capture pipelines, plus cached window filters and skipped restart checks on the active audio device. Real captures are unchanged.
* **Apple Calendar tile is hidden on Windows** — the **settings → connections** Apple Calendar tile no longer appears on Windows machines where it cannot connect. See [connections](/connections).
* **macOS Calendar status no longer goes stale** — the calendar connection now uses a single shared EventKit store and refreshes correctly on macOS 26, so a "not yet authorized" state doesn't persist after you grant access.
### bug fixes
* **macOS auto-update can finish installing again** — "restart to apply update" was a no-op on a recent macOS build because the restart command wasn't wired up. Restarting from the update prompt now applies the pending update.
* **tray shows "Stop HD recording" while HD is active** — the macOS tray used to show the regular "Stop recording" label during an HD session. It now reflects HD state so it's clear which capture you're stopping.
* **tray reads "outside work hours" instead of stuck on "Starting…"** — when the work-hours schedule pauses capture, the tray now labels the state correctly instead of leaving it on "Starting capture session…".
* **ghost keystrokes on macOS are gone** — removed the accessibility probe event tap and added a graceful shutdown path so the focused app no longer receives stray phantom key events on macOS.
* **dark-themed scrollbars and native controls on Windows** — native scrollbars and OS-rendered controls now respect dark mode on Windows, instead of staying light against a dark UI.
* **cursor and selection mid-sentence in the editor** — fixed a regression where placing the cursor or selecting text in the middle of a sentence (chat / meeting notes) could land on the wrong character or break selection entirely.
* **timeline arrow-right keeps working while recording** — the right-arrow key no longer stops navigating the timeline when recording is active. See [search screen history](/search-screen-history).
* **no cross-device mic echo in live transcripts** — live meeting transcripts no longer pick up the same audio twice when multiple capture devices are active. See [meeting transcription](/meeting-transcription).
* **live transcripts no longer drop segments on a coverage-window miss** — fixed a case where a single coverage-window miss could silently drop a live transcript segment. See [meeting transcription](/meeting-transcription).
* **all Google accounts appear in "Coming up"** — the Coming up calendar fetch now merges events from every Google account you've connected, not just the primary one. See [meeting intelligence](/meeting-intelligence).
* **LAN device discovery is opt-in** — mDNS-based LAN discovery is now off by default and only runs when you explicitly turn it on, so corporate networks no longer see chatty discovery traffic from screenpipe.
* **`--ignored-urls` actually filters captures now** — the CLI flag was parsed but never applied to the capture path. Ignored URLs are now skipped end-to-end. See the [CLI reference](/cli-reference).
* **pipes can use OAuth GitHub connections** — pipes were unable to reach GitHub through the OAuth credential proxy. The proxy now exchanges the OAuth token correctly so pipes can authenticate to GitHub without a manual PAT. See [connections](/connections).
* **owned browser keeps the title set with `eval`** — `pi.browser.eval` was clobbering title changes set from inside the page. The owned-browser tab now keeps the latest title from `eval`. See [pipes](/pipes).
* **chat sidebar no longer reopens after switching chats** — switching chats sometimes caused the sidebar to pop back open. It now stays in whatever state you left it.
* **write queue recovers from persistent disk-I/O wedges** — if the database write queue wedged on a flaky disk, screenpipe could stop persisting captures until restart. It now detects sustained I/O failures and rebuilds the queue automatically.
* **clearer data-deletion settings** — the data-deletion section in settings is now split into two cards, separating "clear local data" from "delete cloud data" so it's obvious which action wipes what.
* **"Pro" copy renamed to "Business"** — the few remaining user-facing "Pro" labels in **settings → account** now match the actual plan name, "Business".
* **account plan label uses your subscription plan, not cloud status** — the Account screen now reads the plan name from your subscription record instead of inferring it from cloud-subscribed state, so paused or special-cased accounts show the correct tier.
* **Book-a-call row removed from feedback settings** — the redundant "Book a call" row is gone from **settings → feedback**.
## week of june 8, 2026
### new features
* **Odoo connection** — a new integration in **settings → connections** lets the agent query and update your Odoo ERP, CRM, sales, and project records alongside your other connected apps. See [connections](/connections).
* **drag-and-drop images into meeting notes** — drop image files anywhere on a meeting note to embed them inline at the drop point. A black drop overlay confirms the target, and images are auto-resized on the way in. The dedicated insert-image toolbar button is gone. See [meeting intelligence](/meeting-intelligence).
* **annual upgrade option in the in-app Account page** — the Pro upgrade in **settings → account** now defaults to annual ($33/mo billed annually, save $200) with an inline toggle back to monthly (\$50/mo).
* **work-hours schedule flags on `screenpipe record`** — two new CLI args, `--schedule-enabled` and `--schedule-rule "day,start,end,mode"` (repeatable; mode is `all`, `audio_only`, or `screen_only`), let you drive the work-hours schedule without editing config. Passing any rule auto-enables the schedule. Capture pauses and resumes in-process — no restart. See the [CLI reference](/cli-reference).
### updates
* **cleaner Claude / Cursor / Codex onboarding cards** — once a card says "connected", the redundant "MCP installed, restart X" line is gone. Notion / Obsidian / ChatGPT cards keep their useful follow-up copy.
### bug fixes
* **Apple Calendar connection works again on signed builds** — the production bundle was missing the macOS calendar entitlement, so EventKit was denied before the system prompt could fire and screenpipe never appeared under **Privacy & Security → Calendars**. The entitlement is back and the permission flow is restored end-to-end. See [connections](/connections).
* **Pro access lasts through the period you paid for** — canceling a subscription used to revoke cloud-AI access immediately because the gate only checked status. It now also entitles you while the subscription is canceled but the paid period hasn't ended yet. Dunning states (past\_due, unpaid, incomplete) stay excluded.
* **logout works on the first click** — an in-flight user refresh could write your user back into settings a beat after you signed out, resurrecting the session and forcing a second click. Sign-out now bumps a monotonic auth generation that any in-flight refresh checks before writing, so a stale response can't bring the session back.
* **recording resumes on macOS after sign in** — after sign out → sign in, the entitlement-flip never restarted capture on macOS because the owner-window check was looking for a window name that only exists on Windows. The check is now platform-aware, and the restart is also serialized so a reconnect can't race teardown and wedge the recorder at "starting capture session".
* **pipe notifications toggle is honored on the `/notify` route** — pipes posting to `/notify` used to display and persist notifications even when you'd turned **Pipe notifications** off. The route now reads the toggle and skips display + history for `type=pipe` when it's disabled. The auto-update "what's new" toast is exempt — it's now tagged as an app update so the **App updates** toggle controls it instead. See [pipe debugging](/pipe-debugging).
* **timeline memory markers land on the correct frame** — the memory diamonds on the timeline were positioned with left-to-right math while the frame row renders right-to-left, so the layer rendered mirrored (and multi-day views drifted further). Markers are now snapped to each frame's real on-screen center, correct under right-to-left, virtualization, day boundaries, and margins. See [search screen history](/search-screen-history).
* **media file paths in chat preserve their full absolute path** — fixed a chat rendering bug where absolute paths to attached media files could be mangled before they were turned into a link, so the resulting link pointed at the wrong file (or nowhere). Windows paths, paths with spaces or parentheses, and paths embedded inside an existing markdown link all round-trip cleanly now.
* **long chats no longer fail with a context-window error** — pi's chat layer always injects recent history into every prompt with no size budget, so a very long conversation, a huge pasted message, or a big tool result could push the prompt past the model's context window and hard-fail with `413 prompt is too long`. The injected history is now budgeted against the preset's existing context limit, dropping the oldest turns first and clamping any single oversized turn.
* **annual Pro upgrade savings copy** — the in-app annual card said "save $200" while annual is actually $100 cheaper than monthly. Both Account upgrade cards now show the correct savings.
* **deny block cleanup after disabling notifications** — turning notifications off used to leave an empty `deny:` block behind in the permissions YAML. The cleanup now also removes the block when it has nothing left in it, including for compact YAML.
## week of june 6, 2026
### new features
* **import device skills into the agent** — a new **Skills** card in **settings → connections** scans your machine for `SKILL.md` folders (e.g. `~/.claude/skills`) or any folder you pick, and imports the ones you choose. Imported skills are mirrored into every pipe and chat session automatically, so the agent picks them up everywhere without per-pipe wiring. See [connections](/connections).
* **rotation-safe connection sync across devices** — an opt-in toggle in account settings now syncs your manual and OAuth connection credentials to your other signed-in devices via an end-to-end encrypted manifest. OAuth tokens merge by a monotonic refresh generation (not wall-clock), so a stale token can never overwrite a freshly rotated one and brick a connection. Off by default. See [connections](/connections).
* **steer queued prompts with Cmd+Enter** — pressing Cmd+Enter while the agent is running now steers any queued prompts in addition to the in-flight turn, and native steers preempt the queue, so course-corrections land immediately instead of waiting for the next idle moment.
* **add images to meeting notes** — meeting notes now accept image attachments inline, with focus-on-click in the editor. See [meeting intelligence](/meeting-intelligence).
* **filter apps that haven't been recorded yet** — the Ignored/Included app pickers under **settings → privacy** now also list installed apps that have no captures yet, each with its real icon and an "installed · not captured yet" hint. You can pre-block or pre-allow an app before it ever shows up in your history. See [privacy filter](/privacy-filter).
* **minimize-to-tray toggle on Windows** — Windows users can now choose whether closing the app window minimizes to the tray or quits, matching the macOS behavior.
* **agent-facing ICS calendar connection** — the ICS calendar integration now exposes a clean agent-facing API so chats and pipes can read your calendar through the same connection surface as everything else. See [connections](/connections).
### updates
* **scheduled pipes honor your local timezone** — raw cron schedules (and the "every day at Nam" UI) now evaluate against your local clock instead of UTC, so `0 7 * * *` fires at 7am local. Existing schedules pick up the fix on next run; DST is handled correctly. See [pipes](/pipes).
* **pipe installs pick a tier-safe model** — installing a pipe now uses the `pipes` preset (auto-selected for your subscription tier) instead of the Opus chat default, and the cloud-model picker validates your choice against the gateway tier list with a graceful fallback. A premium model you've deliberately chosen is no longer silently downgraded when the gateway is unreachable.
* **shortcut labels stay in sync everywhere** — keyboard-shortcut hints in the reminder overlay, tray menu, timeline controls, sidebar search, and chat now reflect your current settings live, and disappear when a shortcut is disabled or unset. The tray refreshes the moment you change a binding.
* **pinned and hidden chats survive a save** — saving a conversation now preserves its pinned and hidden state instead of resetting it.
### bug fixes
* **browser meetings detect again on Windows** — Meet, Slack web, Teams web, and other browser-tab meetings were undetectable on Windows because the window-title enumerator was silently returning an empty list. Detection now works again across browsers. See [meeting intelligence](/meeting-intelligence).
* **Windows CLI runs as a signed binary** — the `screenpipe` CLI shipped via npm is now signed with the EV cert (only the desktop bundle was signed before), so corporate Windows no longer flags it as "unknown publisher" and Defender/EDR stop quarantining it on launch. See the [CLI reference](/cli-reference).
* **CLI no longer self-destructs inside non-Tauri hosts on Windows** — embedding the CLI in your own Electron (or other) wrapper used to trigger a clean exit within seconds because the auto-destruct watcher required a `screenpipe-app.exe` process to also be alive. The watcher now tracks only the PID you passed it.
* **clearer Windows install failures** — the installer now hard-fails if the bundled VC++ runtime DLLs (`vcruntime140`, `vcruntime140_1`, `msvcp140`) are missing, instead of silently shipping a package that dies on launch with `STATUS_DLL_INIT_FAILED`.
* **panic log for embedded CLI/engine** — the engine binary now writes a `last-panic.log` (with backtrace) next to `screenpipe.log` and flushes Sentry on panic, so integrators embedding the CLI as a child process can see *why* it exited instead of just *that* it did. Written even with telemetry off. See the [CLI reference](/cli-reference).
* **large pasted context in chat works again** — fixed a regression where pasting a very large blob of text into the chat composer could fail to send or truncate the prompt.
* **AI gateway no longer crashes on malformed requests** — two Sentry crash classes are fixed: a request missing a model name now returns a clear error instead of a TypeError, and a request missing a `messages` list is treated as empty.
* **"clear cache" button is labeled "clear"** — the button under the Clear Cache card in settings said "scan" — it now says "clear", which is what it actually does.
* **billing button no longer duplicates "manage"** — removed the redundant Billing button in **settings → account**; the Manage button already covers subscription management.
* **`pi repair` install works on Windows** — fixed the repair flow for the `pi` agent runtime on Windows so it can recover a broken install instead of failing partway through.
* **quieter macOS audio logs** — silenced a noisy ScreenCaptureKit audio-drop warning on macOS so real errors are easier to spot in feedback bundles.
## week of june 5, 2026
### new features
* **clear owned browser data** — a new "clear data" action on the owned browser wipes cookies, storage, and cache for the in-app webview in one click. signs you out of anything the browser was logged into, so you can hand a clean session to the next pipe or chat. see [pipes](/pipes).
* **MCP connections live in settings → connections** — every MCP server you've connected (Krisp, Linear, Notion, Atlassian, custom HTTP, …) now shows up alongside your other integrations in **settings → connections**, with cross-platform detection and one-click management instead of being hidden behind the MCP server panel. see [MCP server](/mcp-server) and [connections](/connections).
* **"get Cursor" prompt when Cursor isn't installed** — opening the Cursor tile in **settings → connections** on a machine without Cursor now shows a clear install prompt with a download link instead of a dead tile. see [connections](/connections).
### updates
* **macOS multi-monitor capture uses noticeably less CPU** — the event-driven capture pipeline now coalesces work across monitors and skips redundant accessibility walks, cutting capture CPU on multi-display Macs without changing what gets recorded. see [search screen history](/search-screen-history).
* **no more phantom or doubled text in Chromium / Electron apps** — the macOS accessibility walker used to re-enable enhanced accessibility on the focused app every 60s (and every frame after a recent regression), which forced Chrome, Cursor, VS Code, Slack, and other Electron apps to rebuild their AX tree mid-typing and could commit pending IME or autocomplete buffers as duplicate characters into the focused field. enhanced mode is now set exactly once per app while it stays focused, eliminating the phantom-text class of bugs and a recurring source of focused-app input lag.
### bug fixes
* **macOS tray menu no longer crashes the app on click** — fixed a use-after-free in the macOS tray where clicking the menu right after screenpipe rebuilt it in the background could dereference freed memory and abort the process. the tray now swaps menus only at safe moments, so rapid menu interaction during recording state changes is safe.
* **Google Sheets OAuth uses a non-restricted scope** — the Sheets connection now requests `drive.file` (access to only the files you explicitly open with screenpipe) instead of `drive.metadata.readonly` (access to every file's metadata in your Drive). same functionality, far less data exposure, and unblocks the Google OAuth verification. see [connections](/connections).
* **background pipes no longer hijack the on-screen chat's browser** — the in-app owned browser is shared across every chat and pipe, and a background pipe navigating its page would pop the browser open inside whatever chat you were looking at and stick there on reopen. navigations are now tagged with the owning chat (or pipe), and the browser sidebar ignores navigations that don't belong to the chat you have open. see [pipes](/pipes).
* **owned browser hides itself when the sidebar unmounts** — closing the chat sidebar (or switching to a view without it) now also dismisses the floating owned browser instead of leaving it hovering over unrelated UI.
* **no more duplicate stub rows in the chat sidebar** — fixed a race that could leave two placeholder rows for the same brand-new chat in the sidebar before the first message landed.
* **event-driven UI capture wires up reliably across platforms** — fixed the input-event capture pipeline so workflow triggers, privacy filtering, and per-platform recorders stay in sync on macOS, Windows, and Linux; UI events are no longer occasionally dropped on app startup or after a recording-config change.
## week of june 1, 2026
### new features
* **copy button on chat code blocks** — every fenced code block in a chat reply now has its own copy-to-clipboard button (keyboard accessible), so you can grab a single snippet without selecting it by hand.
* **paste documents straight into chat** — the chat composer accepts pasted document files (pdf, docx, xlsx, md, txt, csv, json, log, rtf, …) in addition to drag-drop, shows an inline extraction spinner while the text is pulled out, and surfaces a clear error if a file can't be read instead of failing silently.
### updates
* **stronger, smaller text PII redactor** — the on-device redactor that scrubs secrets (API keys, tokens, credentials) before AI sees your screen data shipped a new model: secret recall jumped from 0.83 to 0.96 on held-out providers, oversmash (false redactions) dropped from 34.5% to 6.8%, and the model is \~4× smaller (1110MB → 278MB INT8) at \~3ms p50. existing installs keep running the previous model until they update. see [privacy filter](/privacy-filter).
* **vocabulary badge reflects the real limit** — the custom-vocab header used to show `n/1000` while the detail view showed `n/100`. the badge, import flow, and toasts now all use the actual upstream cap, so you won't think you have headroom you don't.
### bug fixes
* **GitHub connection works again** — every call through the GitHub integration was 403ing because the proxy sent no `User-Agent` header. GitHub now sees a proper UA + accept headers, so issues, PRs, and repo data load through the connection again. see [connections](/connections).
* **mic capture starts the moment you grant permission, even during boot** — if you clicked "Allow" on the microphone prompt before the recording backend had finished wiring up, capture stayed dead until you toggled it manually. the app now retries automatically while the backend is still coming up. see [permissions](/permissions).
* **cleaner logs after unplugging a display** — stale display IDs no longer flood the log with hundreds of `xcap` errors on macOS, so real errors are easier to spot in your feedback bundle.
* **starred pipes empty state** — the pipe store now shows the right empty-state message when your "starred" filter has no matches instead of looking like everything was uninstalled. see [pipe store](/pipe-store).
* **no more crash when ffmpeg is missing** — audio recording and post-processing now return a clean error instead of panicking if a bundled or system ffmpeg can't be found.
* **"open team on the web" button works** — the button in **settings → team** now opens [screenpi.pe/team](https://screenpi.pe/team) in your default browser instead of doing nothing. see [teams](/teams).
* **CoreAudio per-app capture crash fixed** — fixed a use-after-free in the macOS Process Tap path that could SIGSEGV the audio engine during per-app system-audio capture. see [meeting transcription](/meeting-transcription).
* **`screenpipe vault lock` no longer races the running app** — locking the vault from the CLI while the desktop app is open now delegates to the daemon (or refuses cleanly) instead of racing it and leaving the keystore half-locked.
## week of may 31, 2026
### new features
* **OpenClaw connection** — a new integration in **settings → connections** lets you wire OpenClaw into screenpipe alongside the rest of your AI agent gateways. see [connections](/connections) and the [connection reference](/connection-reference).
* **per-field PII redaction toggles** — a new "fields to redact" selector under **settings → privacy → AI PII removal** lets you choose exactly which categories get scrubbed before AI sees your screen data. Secrets (API keys, tokens) are always on; names, emails, phones, addresses, and other sensitive info are opt-in. default is unchanged (secrets only). see [privacy filter](/privacy-filter).
* **document attachments in chat** — the in-app chat file picker and drag-drop now accept documents (pdf, docx, xlsx/xls, md, txt, csv, tsv, json, log, rtf) in addition to images. text is extracted client-side and folded into the outgoing turn so the model can read them, with the clean prompt shown in the bubble and the attached text expandable. works on every preset, with multi-file support.
* **display labels for auto-sent chat prompts** — pipe creation, pipe store fork/publish, speaker organize, and notification follow-up chats now show a clean source label on the prefilled prompt so it's obvious where the conversation came from.
### updates
* **HD recording plays back at true constant frame rate** — the HD recorder now produces a smooth \~10fps chunk regardless of how much is changing on screen or how fast your machine encodes, so playback no longer comes out sparse or sped-up on low-motion screens. timeline offsets and exports stay accurate to wall-clock time. see [search screen history](/search-screen-history).
* **team management moves to the web** — the in-app Team settings section is now a thin card with an "open team on the web" button pointing at [screenpi.pe/team](https://screenpi.pe/team) for consumer accounts. enterprise builds hide the Team sidebar entry entirely — admins manage members, devices, workflows, search, and policies on the enterprise web console. see [teams](/teams).
* **content filter and pipe sharing UI cleanup** — removed the "push to team" buttons, the all/personal/shared-with-team tabs, and the team-only filter views from **settings → privacy** and **settings → pipes**.
### bug fixes
* **Windows microphone no longer goes silent with echo cancellation on USB mics** — fixed a regression where enabling echo cancellation on Logitech C922 and other USB mics on Windows would silence the input. mic capture stays live with echo cancellation on.
* **no more duplicate chats from auto-sent prefills** — fixed a cross-window race where the home window and the floating chat overlay would both run the same auto-sent prompt, producing two near-identical conversations. each intent now mints exactly one chat, and existing duplicates collapse to one row in the sidebar.
* **vision capture recovers after an auto-update restart on a locked screen** — if the app restarted while your screen was locked, macOS reported zero monitors and screen capture stayed dead until a manual restart. capture now retries automatically the moment you unlock.
* **auto-update no longer crashes the speaker engine on restart** — gated the auto-update restart on a boot-ready check so the speaker session can't be torn down mid-init, fixing a SIGSEGV some users saw right after an update installed.
* **fewer background crashes across app, engine, and AI gateway** — retired five top Sentry issues, including a Gemini tool-schema enum coercion bug, a cost-tracker null-model crash, a keychain-decrypt failure that could overwrite the encrypted API key blob, recovery from a corrupted pi-agent package file, and noisy port-conflict reports from the engine.
## week of may 30, 2026
### new features
* **per-app exclusions for system audio** — on macOS 14.4+, you can now exclude specific apps (Stremio, password managers, anything sensitive) from the CoreAudio process tap without turning system-audio capture off entirely. manage the list from **settings → recording**. changes apply within a few hundred milliseconds — no restart needed. see [meeting transcription](/meeting-transcription).
* **general meeting / time-range MP4 export** — a new export pipeline renders a real-time MP4 with synced microphone audio for any meeting or arbitrary time window. available from the meeting note's export button, the `screenpipe export` CLI (`--meeting-id` or `--start/--end [--open]`), and `POST /export` (also wired into the MCP `export-video` tool). see the [CLI reference](/cli-reference) and the [API docs](/for-developers).
* **AI-generated chat titles** — new chats now get a concise, task-specific title from the first message, with safe fallbacks and live streaming across windows. renamed titles still win.
### updates
* **HD recording captures every change** — turning on HD (high-FPS) mode now bypasses content deduplication for the duration of the session, so video, slide flips, and demo replays are captured densely instead of skipped when the accessibility tree doesn't change. a static screen still won't record duplicate frames. see [search screen history](/search-screen-history).
* **timelapse export retired in favor of real-time export** — the legacy `/frames/export` route (fixed-fps timelapse) is gone. every "export my last N minutes" path — chat agent, MCP `export-video` tool, and the video-export pipe — now uses `POST /export`, which produces a real-time clip with synced audio instead of a sped-up sequence of frames. see the [API docs](/for-developers).
* **provider-aware error messages, with one-click report** — connection and pipe-install failures now show a clear, provider-specific reason and a "report issue" action right at the error site, so you can flag a broken integration without digging through logs. see [connections](/connections).
* **simpler HD recording tray label** — the menubar entry for HD is now just "Record HD" in the idle state; the active state still shows fps in parens.
* **display labels in meeting and pipe chat prefills** — when a meeting or pipe seeds a chat, the prefilled prompt now includes a clean display label for the source so the conversation starts with the right context.
### bug fixes
* **chat keeps full conversation context on every send** — fixed a regression where chat could silently drop prior turns after the agent compacted, crashed, or auto-restarted, so the model occasionally replied as if the conversation just started. recent history is now re-injected on every prompt.
* **meetings stay alive when the process scan briefly misses** — a transient miss in the meeting-app process scan (browser-extension websocket drop, app relaunch, accessibility reflow) no longer ends an in-progress meeting if output audio is still playing; an already-ending meeting is revived in the same case. see [meeting intelligence](/meeting-intelligence).
* **microphone capture starts as soon as you grant permission** — granting mic access (either in the in-app prompt or in System Settings) now reinitializes the audio pipeline automatically, instead of leaving you with zero devices until the next app restart.
* **cron pipes run a missed slot when the app restarts late** — if the app was closed across a scheduled cron tick, the pipe now runs once on next launch instead of silently skipping that slot. see [pipes](/pipes).
* **queued chat follow-ups stay readable** — queued messages now show their original text in the sidebar instead of the injected-history blob.
* **MCP `update-meeting` works again** — the MCP tool was sending PATCH where the server expects PUT; meeting updates from MCP clients now succeed. see [MCP server](/mcp-server).
* **clearer MP4 export errors** — failed exports now show the full underlying reason (e.g. "no screen frames indexed for this range") instead of a misleading top-layer message.
* **preset name duplicate validation trims whitespace** — leading/trailing spaces no longer let you save two presets with effectively the same name.
* **chat sidebar polish** — fixed a cyan stripe artifact when collapsing a section and the `⋯` menu overlapping the hover time label.
* **transcription model downloads work on corporate networks** — the model downloader now uses the system TLS store, so corporate root CAs (Zscaler, Netskope, etc.) are trusted and first-run model downloads no longer fail with cert errors.
## week of may 29, 2026
### new features
* **Workflowy and Readwise connections** — two new integrations in **settings → connections** let screenpipe pull your Workflowy outlines and Readwise highlights into chat and pipes alongside the rest of your context. see [connections](/connections) and the [connection reference](/connection-reference).
* **OAuth login for MCP servers** — bring-your-own MCP servers now support OAuth, so you can connect Linear, Notion, Atlassian, and other OAuth-gated MCPs from **settings → connections** without hand-pasting bearer tokens. see [connections](/connections) and [MCP server](/mcp-server).
* **VS Code terminal capture** — screenpipe now captures terminal output inside VS Code (xterm.js) and labels each terminal window with its session name, so commands and shell output are searchable just like editor text. see [search screen history](/search-screen-history).
* **bounded HD recording for meetings** — meetings now record at higher resolution for the duration of the call and revert to your normal capture quality automatically when the meeting ends, so meeting screenshots stay legible without burning disk between meetings. see [meeting intelligence](/meeting-intelligence).
* **meeting search by title, attendees, and notes** — the meetings list now supports a search box that matches titles, attendees, and notes, plus an explicit "show more" instead of infinite scroll. see [meeting intelligence](/meeting-intelligence).
* **automatic meeting detection toggle** — a new switch in **settings → meetings** lets you turn auto-detection off entirely if you'd rather start meetings manually. see [meeting intelligence](/meeting-intelligence).
* **Claude Opus 4.8 in the model picker** — the new Anthropic flagship is selectable in chat and the AI gateway auto waterfall.
* **chat keyboard shortcuts** — Cmd+N / Ctrl+N opens a new chat from anywhere, and Ctrl+Tab cycles through recently opened chats.
* **multi-account Google Docs and Sheets** — connect more than one Google account for Docs and Sheets; the account picker is now forced on every Google and Microsoft sign-in so you always land in the right workspace. see [connections](/connections).
### updates
* **shorter onboarding** — the encrypt-data step is gone (the local store is now encrypted by default) and the pipe step is a single default-checked bundle (digital-clone + personal-crm) instead of a 3-path picker. see [getting started](/getting-started).
* **pipes page toolbar** — the pipes page chrome is collapsed into a single toolbar, with search, filters, and install all in one row. see [pipes](/pipes).
* **gemini-3.5-flash at the top of the auto waterfall** — the AI gateway now prefers gemini-3.5-flash for the default `auto` model when latency and cost both matter.
* **SDK 0.4.2 with native bindings** — `@screenpipe/sdk` now ships native bindings across all supported platforms and the Swift mirror tags automatically on each npm publish. see [pipes](/pipes).
* **`App::Title` window scope documented in the SDK** — `RecorderOptions` and `FilterPatch` tooltips now describe the `App::Title` syntax inline. see the [CLI reference](/cli-reference) and [privacy filter](/privacy-filter).
### bug fixes
* **automatic language detection works for non-English audio again** — the transcription engine now respects the detected language instead of falling back to English for every recording.
* **auto-merge no longer reopens meetings you stopped on purpose** — if you explicitly end a meeting, a follow-up calendar block won't silently re-attach to it. see [meeting intelligence](/meeting-intelligence).
* **recording no longer stuck on "Starting" after monitors change** — stale monitor IDs (e.g. after unplugging an external display) no longer leave the engine in a perpetual starting state.
* **system audio captured reliably when following system defaults** — desktop app no longer drops system audio after the default output device changes.
* **process-tap audio uses the aggregate device's nominal sample rate** — fixes silent or garbled per-app audio on macOS Core Audio aggregate devices.
* **Windows: excluded apps are actually filtered from capture** — apps in your exclude list were leaking into screenshots in some configurations; the filter now applies consistently. see [privacy filter](/privacy-filter).
* **screen-capture permission probe** — on macOS, screenpipe now verifies real screen-capture access instead of trusting `CGPreflightScreenCaptureAccess`, which lies after permission revokes. see [permissions](/permissions).
* **Intel-Mac Pi install** — the "Bad CPU type in executable" error when installing Pi on Intel Macs is fixed.
* **HTTP MCP sessions register after initialize** — third-party HTTP MCP clients that send the initialize handshake before the first tool call now connect reliably. see [MCP server](/mcp-server).
* **low-battery power transitions** — a crash on very low battery (missing pause profile fields) and a bogus full-pause when only macOS Low Power Mode was on are both fixed.
* **low-battery notification copy** — the low-battery toast no longer mentions "whisper" specifically; it now matches whichever transcription engine you're using.
* **chat fixes** — local file links and local media attachments render reliably, mid-tool-call assistant replies stay in one bubble when you switch windows, chat sidebar stays in sync across windows, switching chats no longer overwrites the new one with the old one, mermaid diagrams are readable in both light and dark modes, and pipe-run assistant turns are coalesced with the real work duration shown.
* **timeline "open settings" button works again** — the gear icon on the timeline overlay opens settings instead of doing nothing.
* **first-launch crash fix** — a React #185 boot crash on first launch is gone.
* **chat preset stays where you put it** — switching chat models no longer snaps the preset selector back to the default, and the same fix applies on send.
* **newly-installed pipes don't fire instantly** — cron pipes no longer run a stale or just-installed schedule immediately on install; the next run waits for the real cron tick. see [pipes](/pipes).
* **misleading "join and take notes" button removed** — the in-progress meeting toast no longer shows a join button for meetings already in progress.
* **search API accepts more bool formats** — query params now accept `1`/`0`/`yes`/`no`/empty in addition to `true`/`false`. see [API recipes](/api-recipes).
* **clearer "not connected" vs multi-account errors** — connections now distinguish a missing account from an ambiguous one (multiple accounts connected, no default), with an explicit account picker. see [connections](/connections).
* **Windows installer** — bundled sidecars are stopped before NSIS updates so installs no longer fail with "file in use", and SSL.com signing fails fast on quota errors instead of burning five retries.
## week of may 25, 2026
### new features
* **`screenpipe search` CLI** — query your local history straight from the terminal without the daemon running. Same flags and JSON shape as `GET /search`, so existing `jq` filters work unchanged and AI scripts can read your data even when the desktop app is closed. see the [CLI reference](/cli-reference).
* **`screenpipe team` CLI for enterprise admins** — three new subcommands (`screenpipe team devices`, `screenpipe team search`, `screenpipe team records`) let team admins query teammates' history from any machine they've signed into, with no local daemon required. uses your `team_api_token` from `~/.screenpipe/enterprise.json`. see the [CLI reference](/cli-reference) and [teams](/teams).
* **Discord community link in the Help menu** — jump straight into the screenpipe Discord from the in-app Help section.
### updates
* **macOS capture is much lighter on WindowServer and battery** — screen capture width is now coupled to your `video_quality` setting (`low` 1280, `balanced` 1920, `high` 3840, `max` native) and the GPU does the downscale at source instead of reading back native-resolution frames. Biggest wins on external 4K/6K displays; default users on built-in laptop screens see no change. Text extraction quality is unchanged because screenpipe reads accessibility trees first.
* **pause states actually stop the OS from producing frames** — when capture pauses (screen locked, critical battery, DRM-protected window, outside your schedule) screenpipe now releases the underlying capture stream instead of just sleeping the reader. WindowServer / replayd no longer keep composing frames for a sleeping consumer. Recovery on the next capture trigger adds \~200 ms one-time. see [privacy data flow](/privacy-data-flow).
* **smaller, faster on-device PII redactor** — the text redaction worker now runs the v45 phase 3 ONNX INT8 model (\~278 MB, 90.2% HIPAA, sub-10 ms p50) with CoreML / DirectML / CPU execution providers, replacing the previous 2.8 GB Candle model. First-run auto-downloads with SHA verification. see [privacy filter](/privacy-filter).
* **clearer memory sync status in connections** — the "sync now" button in connections now pops a toast on click, shows the real outcome (wrote, unchanged, skipped) instead of a generic "synced", and folds the file path + relative "Xs ago" timestamp into a single status card. see [connections](/connections).
* **canonical domain switch to screenpipe.com** — desktop app and CLI website links now point to `screenpipe.com`. Existing `screenpi.pe/join/...` team invites still work, and API endpoints are unchanged. see [teams](/teams).
### bug fixes
* **API auth key visible in Settings before the server finishes spawning** — opening Settings → Privacy during the brief window between app launch and server start no longer leaves the API key field blank; it now falls back to the cached value and updates in place. see [for developers](/for-developers).
* **`npx screenpipe-mcp --http` now works as documented** — the README one-liner used to 404 because no `screenpipe-mcp-http` package existed on npm. The `--http` flag on the main package now routes to the HTTP server directly. see [MCP server](/mcp-server).
* **auto-restart toggle shortcut fixed** — the keyboard shortcut for toggling auto-restart now fires reliably.
* **`screenpipe://view` links open in the in-app viewer everywhere** — deep links inside notifications, notification history, chat, and the viewer itself now all route through the same handler, so a link copied from a notification into chat opens the in-app viewer instead of falling through to the browser.
## week of may 24, 2026
### new features
* **bring-your-own MCP servers** — register custom HTTP MCP servers (Brave Search, Linear, Notion, internal company MCPs) from **settings → connections** and call their tools from pipes and chat. add a name, URL, and optional headers, test the connection, and toggle on. see [connections](/connections) and [MCP server](/mcp-server).
* **SDK event stream** — `@screenpipe/sdk` (now 0.4.1) emits a stable set of events — `start` / `stop`, `recording_started` / `recording_stopped`, `paused` / `resumed`, `app_switched`, `frames_progress`, `permissions_changed`, and `error` — across the Node, Electron, Tauri, and Swift bridges, so host apps can react to recording state and progress without polling. see [pipes](/pipes).
* **scoped window filters with `App::Title`** — `ignored_windows` and `included_windows` now accept an `App::Title` syntax: `Slack::#hr` matches only the `#hr` window inside Slack, `::Confidential` matches that title in any app, and bare entries like `Slack` keep their original meaning. scoped includes whitelist one window without affecting other apps. see the [CLI reference](/cli-reference) and [privacy filter](/privacy-filter).
* **macOS VoiceProcessingIO microphone** — opt in to Apple's VoiceProcessingIO audio unit on your default mic for echo cancellation and noise suppression on meeting calls; falls back to the standard HAL path automatically if VPIO can't start. see [meeting transcription](/meeting-transcription).
* **aggressive low-battery tiers** — auto power mode now pauses microphone capture at ≤20% battery and pauses all capture at ≤10%, then resumes when you're back on AC — so a long unplugged session won't drain you to empty. you'll get a desktop notification on each downgrade.
### updates
* **Electron apps capture the full content tree** — VS Code, Slack, Discord, Obsidian, and Notion previously lost deeply-nested content (terminal output, editor text, chat scrollback) because the macOS accessibility shell consumed most of the walk budget. the walker now resets its depth at each web-area boundary, so the full budget is available inside the app.
* **macOS sample-rate handling for VPIO and USB mics** — fixed sample-rate mismatches that could silently drop input from VoiceProcessingIO and some USB audio devices; the engine now retries on the standard HAL path when VPIO can't open the stream.
### bug fixes
* **ChatGPT reconnect when the session expires** — the ChatGPT connection now shows a clear "session expired" warning with a one-click reconnect, instead of failing requests in the background. see [ChatGPT](/chatgpt).
* **no more shortcut-reminder error loop on Windows** — a missing first-run settings file no longer triggers a flood of webview → Rust errors; the reminder check now confirms the file exists and coalesces rapid setting changes.
* **clearer S3 upload errors** — when an upload to cloud storage fails, the desktop app now surfaces the server's reason (signed URL expired, content-type mismatch, etc.) instead of just the HTTP status code.
## week of may 23, 2026
### new features
* **multi-monitor paired capture in the SDK** — `@screenpipe/sdk` (now 0.3.0) records all your monitors by default and can opt into the same event-driven capture pipeline the CLI uses, so an SDK-recorded session lands in the same database your pipes already query. see [pipes](/pipes).
* **deepgram live diarization in meeting notes** — the live meeting transcript now labels each turn with a speaker (you on your input device, "speaker 2/3/…" for others) instead of one undifferentiated stream, and adjacent turns from the same person collapse into one line. see [meeting transcription](/meeting-transcription).
* **Codex CLI + Obsidian in onboarding** — the onboarding integration grid now offers one-click setup for Codex CLI (as an MCP client) and Obsidian (auto-discovers your first vault). see [connections](/connections) and [Obsidian](/obsidian).
* **CLI flags for keystroke, clipboard, and scroll capture** — `--capture-on-keystroke`, `--capture-on-clipboard`, and `--capture-scroll` let you link non-printable key events, clipboard rows, and scroll-stop triggers to the screen frame they fired on. see the [CLI reference](/cli-reference).
* **kebab menu on scheduled pipe rows** — scheduled runs in the chat sidebar now have the same hover menu as conversations: stop the run, or pin/rename/archive/delete its session record.
* **"check for updates" card in settings** — Settings → General now has a visible "check now" button so you can pull a new version on demand instead of waiting for the next periodic check.
### updates
* **DRM-aware pause is now on by default** — screenpipe pauses recording on Netflix, Disney+, Hulu, HBO Max, and other DRM streams out of the box, with reliable detection in Safari (including subdomains like `apps.disneyplus.com`). no more black frames in your timeline from protected content.
* **Auto power mode by default** — new installs start in Auto, which throttles capture on battery and restores full quality on AC. existing power-mode preferences are preserved.
* **onboarding tells you why the engine didn't start** — if recording permissions are missing (or another spawn error fires), onboarding now shows the real reason and the bundle id it's asking for, with one-click "open system settings" and "reset & re-request" actions. see [permissions](/permissions).
* **clearer error when the in-app chat can't load** — the Settings chat panel now shows an actionable message and a support email when the connection fails, instead of a raw "Load failed".
* **OpenAI Realtime removed as a meeting transcription provider** — the unused OpenAI Realtime path has been retired; selected-engine, screenpipe-cloud, and deepgram-live remain. see [meeting transcription](/meeting-transcription).
### bug fixes
* **OAuth connections no longer brick themselves overnight** — fixed a refresh bug that silently dropped your `refresh_token` and identity metadata (email, workspace, team id) on every refresh, causing connections to flip to "needs attention" after about an hour. multi-account setups and providers that don't echo `expires_in` on refresh are also covered. see [connections](/connections).
* **failed updates are retryable** — if a download fails (network drop, disk full, 5xx), the tray item now says "Update failed — click to retry" and the next periodic check picks it back up; transient failures also auto-retry with backoff. a desktop notification surfaces the failure instead of failing silently.
* **disabling auto-update is respected on Windows** — when auto-update is off, Windows no longer force-installs the new version during a periodic check. you'll see the banner and choose when to restart.
* **dismissing the update banner now sticks** — clicking the X on the update banner keeps it hidden across periodic re-checks and tab switches, until a new version actually arrives or you click "update now" in the tray.
* **meeting transcripts no longer show duplicate lines** — fixed a case where chunks pulled from `/search` and from the meeting transcript endpoint were deduped under different keys, so every segment appeared twice.
* **background transcription stops fighting live meeting notes** — when a live meeting note is running, the background transcriber no longer re-processes the same audio, eliminating duplicate text in the transcript.
* **Google Calendar connect button works for free users** — clicking connect on Google Calendar without a Pro plan now shows the "pro required" upgrade prompt instead of silently doing nothing, and surfaces "needs attention" when a token exists but can't be decrypted. see [connections](/connections).
* **Zoom and other long-lived OAuth tokens refresh cleanly** — fixed a follow-up edge case where a stale `expires_at` could cause an infinite refresh loop for providers that don't return `expires_in` on refresh (Slack long-lived tokens and similar).
* **Pi assistant starts reliably on Windows** — migrated the bundled pi-agent to its new package namespace and pinned a transitive dependency that was failing to hoist on Windows; install errors are now surfaced in the toast instead of a generic "exited with code 1".
## week of may 22, 2026
### new features
* **GitHub Copilot CLI as an MCP client** — connect Copilot CLI from **settings → [connections](/connections)** and use it alongside Claude Code, Codex, and the other supported agents. see [Copilot CLI](/copilot-cli).
* **redesigned connections panel** — Input Monitoring is now a first-class tile, a new Featured row highlights the integrations most people set up first, and Apple Calendar has been removed in favor of the macOS calendar permissions used elsewhere. see [connections](/connections).
* **clipboard capture without Input Monitoring permission** — clipboard text is now captured through the UI recorder, so you no longer need to grant macOS Input Monitoring just to search what you copied. toggle from **settings → recording** or via the CLI. see the [CLI reference](/cli-reference).
* **calendar-aware meeting prewarm** — 2–3 minutes before a calendar event starts, screenpipe surfaces a toast to start the live meeting note, so you're never caught flat-footed when a call begins. see [meeting transcription](/meeting-transcription).
* **silent background updates with a restart banner** — app updates now download quietly in the background; you only see a banner when the new version is ready to apply, and the restart is one click. auto-update is off by default — you stay in control of when to switch versions.
* **enterprise update policy** — IT admins can pin specific app versions per organization, control whether the consumer update banner shows for employees, and roll updates to fleets on their own schedule. see [teams](/teams).
* **MCP team telemetry tools** — when authenticated with an enterprise key, the screenpipe MCP server exposes new tools for querying team telemetry from any MCP-compatible agent. see [MCP server](/mcp-server) and [teams](/teams).
* **frame ID on `/search` results** — `/search` input results now include the `frame_id` they were captured from, so pipes can join search hits back to the exact screen frame for screenshots or replay. see the [API docs](/for-developers).
* **richer SDK runtime controls** — the `@screenpipe/sdk` (now 0.2.0) adds `setFilters` / `filterStatus` at runtime, emits `paused` and `resumed` events, and honors ignored/included windows plus ignored URL filters from your pipe code. see [pipes](/pipes).
* **CLI version-check nudge** — the CLI tip rotation now periodically reminds you when a newer CLI is available so you don't miss fixes. see the [CLI reference](/cli-reference).
* **`ui_recorder` status in `/health`** — the health endpoint now reports whether the UI recorder (and clipboard capture) is running, so monitoring tools can answer "is clipboard capture on?" without scraping logs. see the [API docs](/for-developers).
### updates
* **more accurate daily summary time breakdown** — the daily summary now derives per-app time from accessibility events instead of OCR, so the breakdown matches what you actually used rather than what happened to be on screen.
* **OAuth tokens refresh in the background** — a new refresh scheduler renews OAuth tokens proactively, fixing the Zoom 15-hour rotation bug and similar drop-outs for other connections. see [connections](/connections).
* **UI events linked to the frames that triggered them** — clicks, scrolls, and key presses are now paired with the screen frame they fired on (including on Windows and when the frame was deduplicated), so the timeline popover lights up more reliably and is easier to click.
* **share-logs no longer creates a public link** — the "share diagnostic logs" flow now just uploads to support and acknowledges receipt; the old shareable URL has been removed to prevent accidental log exposure.
* **lower idle CPU on Windows** — background workers wake less often when the app is idle, cutting battery drain on laptops.
* **chat sidebar polish** — streaming and activity signals are unified into one indicator, scheduled rows show a live signal with status and elapsed time on hover, and recents rows align their age label with the live signal.
### bug fixes
* **frontend crashes now show up in reports** — top-level WebView errors are captured and shipped with source maps so support can diagnose UI crashes instead of seeing a blank stack.
* **audio falls back when a pinned mic disconnects** — unplugging your pinned input device no longer kills capture; screenpipe falls back to the system default input automatically.
* **timeline day-picker restored, no more device spam** — fixed a regression that broke the timeline day-picker and flooded logs with `device_monitor 'default'` warnings.
* **phantom "new content" pill in chat** — fixed a case where the "new messages" pill stuck around after you'd already scrolled to the bottom.
* **chat preserves pipe-run titles** — switching tabs or syncing history no longer overwrites the title of a pipe-driven chat.
* **clipboard events carry app + window context** — copied text is now tagged with the app and window title it came from, so clipboard search results are filterable.
* **clipboard capture auto-recovers** — after a crash, clipboard capture restarts automatically instead of requiring you to delete a marker file.
* **organize-with-AI opens the right view** — the speakers "organize with AI" action now opens the home chat instead of an empty settings pane.
* **pipes load presets from encrypted store** — pipes whose configuration lives in the encrypted `store.bin` now resolve presets correctly at start.
* **MCP `keyword-search` quality** — fixed argument mapping, time-range normalization, error messages, and OCR truncation in the screenpipe MCP `keyword-search` tool. see [MCP server](/mcp-server).
* **audio reconciliation zombie loop** — fixed a case where the audio chunk processor could spin forever after a transient failure; chunks now move through an explicit state machine.
* **`/health` can't deadlock the CLI** — bounded the health response time so external watchdogs no longer kill a healthy CLI that was momentarily slow to answer. see the [CLI reference](/cli-reference).
* **admin team API token field is editable** — first-time admins can now paste their team API token in **settings → [teams](/teams)** instead of seeing a read-only field.
* **`screenpipe status` reads the right database** — the CLI now resolves `db.sqlite` from `base_dir`, matching where the daemon actually writes. see the [CLI reference](/cli-reference).
* **`npx screenpipe` and global install work again** — the npm wrapper bin is wired correctly so both `npx screenpipe …` and `npm i -g @screenpipe/cli` run the right binary. see the [CLI reference](/cli-reference).
* **enterprise macOS pkg notarization** — the enterprise macOS installer is notarized correctly so admins no longer see Gatekeeper warnings on first install. see [teams](/teams).
* **enterprise sync auth** — the enterprise sync worker re-reads the local API auth key on every request, so rotating the key no longer requires a restart.
* **Windows timeline popover clickability** — expanded the popover hit area so it's easier to open from the timeline.
## week of may 18, 2026
### new features
* **chat source citations** — answers in chat now show a citation footer linking back to the screen, audio, or memory sources used to generate them, so you can verify what the agent saw before trusting an answer.
* **Windows microphone echo cancellation** — Windows mic capture now wires through AEC, cutting room echo and speaker bleed during meetings. toggle it from **settings → recording** or via the CLI. see the [CLI reference](/cli-reference).
* **speaker search uses diarization turns** — searching by speaker now matches against per-turn diarized segments instead of whole chunks, so results land on the exact moment a person spoke. see [meeting transcription](/meeting-transcription).
### updates
* **faster app launch** — heavy chat and rewind renderers (code blocks, mermaid diagrams, message list) now defer until needed, so the desktop app opens noticeably quicker.
* **snappier chat history** — chat conversation list refreshes are debounced and cached, removing the stutter when switching between long chats.
* **polished meeting notes live transcript** — the live transcript panel inside meeting notes has a cleaner layout, better speaker grouping, and steadier scroll behavior while a meeting is in progress. see [meeting transcription](/meeting-transcription).
* **tighter chat composer and suggestions** — the AI preset picker, suggestion rows, and source cards in chat have been re-spaced and simplified for quicker scanning.
### bug fixes
* **Screenpipe Cloud transcription applies without a restart** — switching to Screenpipe Cloud (Deepgram) transcription now takes effect on the next capture cycle instead of requiring a full server restart.
* **no more lost meeting transcript when live STT fails** — if the live speech-to-text stream drops mid-meeting, the transcript now backfills from buffered audio instead of leaving a gap in the meeting note.
* **pipe-watch tool output renders correctly** — return values from pipe-watch tool calls now display in the chat tool rail instead of showing as empty.
## week of may 14, 2026
### new features
* **per-site consent before importing browser cookies** — when an agent needs to act on a signed-in site (Gmail, GitHub, your bank), the embedded browser now asks you to approve session access for that specific host before copying any cookies from Arc/Chrome/Brave/Edge. saved passwords are never read.
* **CLI flag to skip the meeting detector** — `--disable-meeting-detector` skips the v2 meeting watcher entirely (no process / accessibility scan every 5 s). useful for headless or task-mining setups that only consume `accessibility_text` and `ui_events`. see the [CLI reference](/cli-reference).
* **CLI flag to skip snapshot compaction** — `--disable-snapshot-compaction` skips the background JPEG→MP4 worker for users who don't open the MP4 timeline UI. disk usage falls back to your `--retention-days` setting. see the [CLI reference](/cli-reference).
* **codex-style chat queue steering** — queue follow-up messages while the agent is still working and reorder or cancel them before they run.
### updates
* **transcription fallback notice** — when your requested transcription engine isn't available (signed out, no subscription, missing Deepgram key), the audio panel now tells you which engine is actually running and why, instead of failing silently. see [meeting transcription](/meeting-transcription).
* **multiple OAuth accounts per connection, restored** — connections that support more than one account (e.g. multiple Google or GitHub instances) again list each one separately in **settings → [connections](/connections)** instead of collapsing into a comma-separated label.
* **faster, smoother UI** — overlay data, health checks, meetings, and timeline hooks have been reworked to cut re-renders and main-thread work on macOS. the timeline streamer now caps batches and stops retrying forever on a broken connection, so a stalled stream recovers cleanly.
* **clearer doctor output** — `screenpipe doctor` now verifies the API port is actually listening and gives a step-by-step macOS fix when ScreenCaptureKit can't open system audio (including the exact terminal app to grant in **System Settings → Privacy & Security → Screen & System Audio Recording**). see the [CLI reference](/cli-reference).
* **CLI tips use `npx`** — startup tips for installing bundles and signing in now show `npx screenpipe …` so the commands work without a global install.
* **chat search and switching feel snappier** — additional optimization passes on the chat sidebar and search modal.
* **Windows timeline hardening** — WebView2 startup and the timeline frame stream are more resilient to transient failures, with bounded retries and per-frame limits.
### bug fixes
* **Windows: no more flashing shell windows** — background shell commands triggered by the app no longer pop a console window into focus.
* **meeting notifications now open the right live note** — clicking a meeting notification deep-links into the correct in-progress note instead of a stale one.
* **live transcript order and AI summaries** — fixed out-of-order segments and missing summaries in the live meeting transcript and meeting notes panels. see [meeting transcription](/meeting-transcription).
* **capture exclusions search** — the search and "exclude this app" actions in capture exclusions now update reliably and stay in sync with the current query.
* **AI gateway error reporting** — fixed Sentry regressions in the AI gateway for Anthropic, Gemini, and Vertex providers so failed requests are reported with the right context instead of being swallowed.
## week of may 10, 2026
### new features
* **local AI PII removal** — the on-device PII redactor is back, now powered by OPF v3 for text and rfdetr\_v9 for images. Defaults to a credentials-only policy that catches Anthropic, OpenAI, Google, Hugging Face, GitHub, and Cloudflare API keys without touching the rest of your timeline. Apple Silicon gets a \~6× faster MLX path on macOS 26+. enable in **settings → privacy → AI PII removal**. see [privacy filter](/privacy-filter).
* **toggle for cloud audio, video, and image analysis** — single switch in **settings → privacy** controls whether agents can call the cloud media analysis enclave. on by default; flip it off to keep media analysis fully local.
* **Codex MCP connection** — connect Codex from **settings → [connections](/connections)** to use it as an MCP client alongside Claude Desktop, Claude Code, and the other supported agents.
* **Bee wearable integration now works** — the connection was registered but TLS-failed against Bee's private root CA. it now ships a real, logged-in client.
* **chat search across past conversations** — the existing memory search now finds chats too. press the search shortcut and start typing.
* **chat picker in the collapsed sidebar** — switch between chats without expanding the sidebar.
* **monitor topology toasts** — get a notification when a display is plugged in, unplugged, or swapped (e.g. clamshell to external). turn it off in **settings → notifications → display changes** if it's noisy on a rotating dock setup.
* **hide thinking blocks** — collapsible chain-of-thought blocks in chat are hidden by default. toggle from **settings → display → hide thinking blocks**.
* **pipe activity indicators** — running pipes now surface a live status indicator in the pipe list.
* **rename speakers in the meeting transcript sidebar** — click any speaker name in the transcript panel to rename, search similar speakers, and propagate the rename across the meeting.
* **copy meeting transcript** — new copy button in the meeting view copies the full transcript (not just the filtered view) as plain text.
* **pick which pipe summarizes meetings** — new picker next to "summarize with AI" lets you choose any installed or store pipe to drive meeting summaries.
* **split and merge meetings** — new `POST /meetings/:id/split` endpoint and a smarter merge that preserves titles, attendees, and notes from both sides. see the [API docs](/for-developers).
* **back up your real-browser login state into the agent browser** (macOS) — the agent's embedded browser now inherits cookies from Arc, Chrome, Brave, and Edge, so authenticated sites (Twitter/X, Gmail, GitHub, your bank) work without a manual sign-in. each browser is opt-in via a one-time Keychain prompt.
* **one-click browser extension pairing** — pair the screenpipe browser extension in a single click from the desktop app.
* **enterprise managed AI presets** — admins can publish managed presets, lock the default, and gate custom presets per employee. see [teams](/teams).
* **Intune deployment guide** — IT admins deploying screenpipe to Windows fleets via Microsoft Intune now have a canonical reference. see [Intune deployment](/intune-deployment).
### updates
* **friendlier "sync now" error** — the pipes-sync and memories-sync buttons in the account panel now disable while the engine is still starting, and surface a readable message instead of `Load failed (localhost:3030)`.
* **chat tool rail readability** — agent actions like `curl -H "Authorization: Bearer ..."` are now rendered as plain English ("Searched ChatGPT 'q'", "Saved memory", "Navigated agent browser → calendar.google.com") with the matching app icon. web tool calls also show the destination site's favicon.
* **connection icons in chat tool rail** — see at a glance which integration a tool call hit.
* **secure team sharing setup from the desktop app** — initialize encrypted team sharing without leaving the app. see [teams](/teams).
* **chat works while logged out** — suggestion cards and a login button show up in unauthenticated chat sessions instead of an empty screen.
* **chat shows suggestions when unauthenticated** + the AI preset selector now surfaces a login button so there's always a clear way in.
* **mic capture is faster to recover** on USB and Bluetooth devices — phantom audio interfaces (controller adapters, dock stubs, headset descriptors with nothing plugged in) are filtered out, so the device picker only shows mics that actually record. on Windows, format mismatches fall back to the system default format automatically.
* **audio reliability under load** — increased the write connection pool and improved reconciled-transcript playback so merged audio chunks stay in sync with the timeline.
* **embedded browser stays inside the app** — the agent browser no longer floats above unrelated apps and now follows the parent window for minimize, hide, and app switch.
* **embedded browser performance** — kills a 60 Hz polling loop that was driving WindowServer and the SCK audio daemon to 100 % CPU when the browser panel was open.
* **embedded browser remembers where you left off** — saved browser URLs now reliably restore on app launch.
* **monitor recovery after disconnect** — vision capture now retries automatically when a display is unplugged and reconnected.
* **system audio toggle copy** — clearer, shorter description of what "CoreAudio system audio" does and the Zoom/Meet/Teams trade-off.
* **changelog is live** — the in-app changelog dialog pulls the latest entries from screenpi.pe instead of a stale bundled file.
* **AI gateway credits extend daily cost cap 1:1** — the $50 top-up button now actually gives you $50 more headroom on Opus / Sonnet instead of getting blocked by the daily cost limit.
* **lower idle RAM** — local text-PII (\~2.8 GB) and image-PII (\~150–200 MB) models lazy-load and unload after 60 s idle, freeing several GB when the worker isn't busy.
* **explicit logs when AI PII removal is off** — log lines now confirm the model isn't loaded so you can verify the toggle worked.
* **AirPods + Bluetooth health status** — `/audio/device/status` now reports `active_no_data` while a hijacked or silent device recovers, instead of misleadingly reporting `ok`.
* **clamshell mode no longer captures the sleeping built-in display** — the lid-closed laptop panel is filtered out of the capture list, saving cycles and black frames.
* **meeting detection robustness** — added re-entry hysteresis so single-frame UI blips (e.g. Google Meet's auto-hiding toolbar in Arc) no longer flap the meeting state machine.
* **clearer team invite error** — server-emailed invite links don't carry the team encryption key; the error now tells you to grab the full link from the admin's desktop app.
### bug fixes
* **Windows audio capture** — fully reverted the upstream cpal regression that caused Windows 11 24H2 users to record near-silent audio (-85 dB) on Jabra, Logi, and Communications-class USB mics. capture levels and transcription are restored.
* **Windows owned browser** — fixed WebView2 startup and loading failures on Windows.
* **Windows ONNX runtime** — corrected the bundled runtime version so the app launches cleanly.
* **Windows ARM64** — release builds and signing pipeline restored.
* **connection permission prompts** — fixed permission prompts that previously failed to appear when connecting new integrations.
* **connection details open in a dialog** — selecting a connection no longer scrolls the settings page unexpectedly; details open in a modal instead.
* **connection tooltip clipping** — tooltips no longer get cut off inside the connection modal.
* **Claude Desktop MSIX (Microsoft Store) support on Windows** — MCP key injection now finds and patches the MSIX-installed Claude Desktop config.
* **Apple Intelligence tile** is now hidden on non-macOS platforms.
* **Obsidian connection** — vault auto-discovery and a cleaner connect/disconnect flow.
* **connections cleanup** — fixed disconnect reliability, missing icons, and stale state across the connections panel.
* **chat preset switching in existing conversations** — switching presets mid-conversation no longer drops your selection.
* **chat editing preserves what's on screen** — editing a previous message no longer collapses the surrounding context.
* **AI model picker** — search clears when re-opening, and cancel/close behavior is fixed.
* **pipes UX** — fixed dropdown lag, the stuck loading skeleton, offline state copy, and missing feedback in pipe discover.
* **discover-tab "new" badge on home page** is hidden where it didn't apply.
* **speaker email alias deduplication** — speakers with multiple aliases are no longer counted as duplicates.
* **speaker merge from settings** — the "yes, merge" button now actually merges instead of returning a 422.
* **macOS clipboard crashes** — NSPasteboard reads are now dispatched to the main thread, eliminating a class of EXC\_BAD\_ACCESS crashes during heavy clipboard activity.
* **macOS cursor lag** — disabled SCK's cursor and click-ripple compositing, which was causing visible cursor lag during heavy interaction (Chrome tabs, dropdowns).
* **macOS callback panics** — wrapped ObjC→Rust callbacks (scroll, magnify, notification action, dock menu) in panic guards so transient errors no longer SIGABRT the app.
* **pipe orphan PID cleanup no longer SIGTERMs the app itself** — fixed a regression where saving settings could gracefully exit the app via the orphan-pipe cleanup path.
* **settings loss on update is now impossible** — four-layer defense (snapshot, auto-restore, refuse-overwrite, stop empty-writes) protects your AI presets and settings across updates.
* **audio worker shutdown** — clean shutdown signals stop the tokio teardown panics that were filling `last-panic.log` on every quit.
* **audio stream stop use-after-free** — fixed a macOS crash when stopping or switching audio devices.
* **recording start race + health probe** — concurrent capture-start invocations can no longer clobber each other, and a dead HTTP serve task after sleep/wake now triggers a real restart instead of an indefinite "connection error".
* **speaker model loading** — resilient downloads with retries so flaky networks don't leave you without speaker recognition.
* **ORT initialization panics** in the rfdetr image model and speaker init are now caught and surfaced as proper errors instead of crashing the worker.
### new features
* **Zoom integration** — connect Zoom via OAuth so meetings show up alongside other connected apps. configure in **settings → [connections](/connections)**.
* **Hermes Agent connection** — drop screenpipe's MCP server into your `~/.hermes/config.yaml` from the connections panel. see [MCP server](/mcp-server).
* **Bee wearable** — pair your Bee device as a connection so its captures join your screenpipe timeline. see [connections](/connections).
* **clipboard capture privacy toggle** — turn off clipboard capture from settings or via a new CLI flag when you don't want copied text recorded. see the [CLI reference](/cli-reference).
* **focused document file paths** — screenpipe now records the absolute path of the document you're editing in TextEdit, Obsidian, Cursor, VS Code, Windsurf, VSCodium, and Trae, so you can search by filename.
* **meeting notes timeline scrubber** — meeting transcripts now have a scrubber with full transcript playback, speaker rename popover, and an "open in timeline" button. see [meeting transcription](/meeting-transcription).
* **browser API: `/navigate` and `/snapshot`** — drive the embedded browser from your pipes and grab DOM snapshots. see the [API docs](/for-developers).
* **MCP `update-meeting` tool** — let your AI write summaries back to a meeting note via a typed MCP tool. see [MCP server](/mcp-server).
* **manage AI presets from the CLI** — create, update, delete, and set the default preset, plus pin a preset to a specific pipe. see the [CLI reference](/cli-reference).
### updates
* **meeting summarize button** is now front-and-center in the meeting view, and the AI writes its summary back into the note for you.
* **chat works without login** — the b/w login banner is gone; you can chat on free models without an account.
* **browser panel state persists** per conversation — width and collapsed state are remembered when you switch chats.
* **chat polish** — queued messages are visually de-emphasised, the first thought block is collapsed by default, and a live dot pulses in the sidebar while the current chat is streaming.
* **pipes list is faster** — large stdout/stderr payloads no longer ship with every list request.
* **"delete last N minutes"** now actually removes the underlying mp4/wav files and drops cached frames.
### bug fixes
* **clipboard crash protection** on macOS — added a watchdog around NSPasteboard reads so a hanging clipboard owner can no longer take down screenpipe.
* **Claude Desktop MCP 403s** — MCP API key discovery now uses the bundled bun, so auth works without a system bun on `PATH`.
* **privacy scrubs** — API keys and tokens are stripped from the feedback console-log bundle, the cloud JWT is hidden from bash subshells, and auth tokens + emails are no longer logged on the server.
* **audio reliability** — undecodable audio chunks are quarantined instead of retrying forever, and the audio reconciliation retry loop has been killed.
* **chat fixes** — removing `@input` works again, new chats appear in the sidebar immediately, duplicate filters from dropdown buttons are deduped, the "writing…" indicator self-heals on session return, and chat history loss on Windows (sanitized filenames + atomic saves) is fixed.
* **settings** — API key regenerate now respects cancel, apply, and manual edits.
* **shortcuts** — pressing esc or clicking outside cancels a recording capture.
* **timeline** — applied tag chips have a remove button, and empty-state arrow buttons navigate the right direction.
* **meeting notes** — sidebar can be expanded again during a focused meeting, broken frame images are fixed, and the scrubber no longer ends early.
* **embedded browser** — x.com loads again (Safari UA spoof).
* **skill install** — added the download permission and surfaces loading / saved / error states.
* **offline mode** actually blocks pipe network calls now (the half-baked toggle has been removed).
* **Windows** — fixed an a11y crash from the `GetWindowRect` import.
* **pi config** — `pi config` now does a real merge instead of overwriting `~/.pi/agent/models.json`.
## week of april 26, 2026
### new features
* **new integrations** — connect [Microsoft 365 and Teams](/connections), Google Docs, Google Sheets, QuickBooks Online, Bitrix24, Loops, Resend, Supabase, and the Pocket AI voice recorder. configure in **settings → connections**.
* **PII privacy filter** — opt-in filter (powered by a Tinfoil enclave) that redacts personal info from `/search` results and chat messages before they leave your machine. toggle from the chat composer. [learn more](/privacy-filter).
* **parallel chats with background streaming** — start multiple chats and switch between them; responses keep streaming in the background. a new chat sidebar shows pinned chats, recents, and pipes scheduled to run.
* **focus-aware capture** — when enabled, screenpipe only records the focused monitor instead of all of them, halving capture cost on multi-display setups. toggle from settings.
* **per-machine pipe favorites** — star pipes you use most. starred pipes sort to the top of the pipe list and get their own filter chip.
* **LAN-access toggle for the API** — bind the local API to `0.0.0.0` so other devices on your network can reach it. API auth is force-enabled when LAN access is on. see the [API docs](/for-developers).
* **`screenpipe sync remote`** — back up your screenpipe data over SSH/SFTP to a server you control. see the [CLI reference](/cli-reference).
* **`screenpipe db {check, recover, cleanup, unlock}`** — new CLI commands to repair database corruption and reclaim disk space. see the [CLI reference](/cli-reference).
* **`screenpipe logout`** — sign out of your screenpipe cloud account from the CLI.
* **connected apps as @mentions in chat** — type `@` in the chat filter popover to scope a question to a specific connected integration.
* **AI quota warnings** — heads-up notice when you're close to your daily limit on weighted models, so you don't get cut off mid-task.
* **browser extension v0.2** — new popup with connection status, an options page, and token-based auth.
### updates
* **CoreAudio Process Tap is now the default for system audio** on macOS 14.4 and later — better quality and no virtual driver required.
* **API keys are now readable and regeneratable** in the UI. user-set custom keys have been removed in favor of a single managed key.
* **Cursor-style inline edit** — click any of your past chat messages to edit and re-run it.
* **redesigned sidebar** — collapse button next to the macOS traffic lights, search opens a focused overlay window with a real keyboard shortcut, and starred pipes outrank running pipes in sort order.
* **timeline calendar** — empty days are now disabled in the day picker and skipped when navigating with arrow keys.
* **chat models hot-swap** — switching a preset's model no longer restarts the chat subprocess.
### bug fixes
* **mic stays connected on sleep/wake** — fixed false-positive disconnects.
* **Microsoft 365 / Teams OAuth** now uses the correct Azure client ID; personal Microsoft accounts are rejected up-front (Teams scope isn't supported there).
* **database reliability** — multibyte string truncation no longer panics, and connection starvation under heavy writes has been resolved.
* **diarization timeouts** — added a `speaker_id` index that fixes 60s+ stalls on long meetings.
* **memories pipeline** silently stopped updating — now back online.
* **macOS memory leaks** — wrapped clipboard capture, monitor enumeration, and focus-tracker callbacks in autorelease pools.
* **search results** — keyword flat mode no longer drops entries that lack text positions.
* **OAuth flows** — auto-refresh of expired tokens in the generic proxy, query params now forwarded through the connection proxy, broader Google Sheets scope, and a fix for tokens being dropped when reconnecting an instance.
* **notifications** — clicking "Open" on a native macOS notification now reliably brings the screenpipe window forward.
* **onboarding** — MCP install uses the bundled bun, so it works without a system bun on `PATH`. WhatsApp connection now resolves bun the same way.
* **calendar permission** — recovers when the macOS Privacy pane reports denied-but-empty.
* **chat polish** — drag-select restored in user messages, "+ new chat" reuses an empty chat instead of spawning duplicates, "Try again" appears when a model returns an empty response, and free models are always allowed regardless of quota.
* **Windows** — restored ARM64 release builds, switched consumer release to SSL.com EV signing, and propagated system root CAs to bundled bun/node via `NODE_EXTRA_CA_CERTS`.
# ChatGPT — use your subscription with screenpipe
Source: https://docs.screenpipe.com/chatgpt
Connect your ChatGPT Plus or Pro subscription to power screenpipe's AI chat and pipes with the latest OpenAI models — no API key required.
if you have a ChatGPT Plus or Pro subscription, you can connect it directly to screenpipe. this lets you use OpenAI's latest models for chat, summaries, and pipes without managing API keys or paying extra.
## what you get
* **AI chat** — ask questions about your screen history, meetings, and activity using GPT models
* **pipes** — run scheduled or on-demand automations (summaries, time tracking, etc.) powered by your subscription
* **no API key needed** — sign in with your OpenAI account, that's it
## how to connect
1. open screenpipe
2. click the **model selector** next to the chat input (shows "OAI", "Ollama", etc.)
3. select **ChatGPT** as your provider
4. click **sign in with ChatGPT**
5. a browser window opens — log in with your OpenAI account and approve access
6. done — you'll see a green checkmark and your available models
## choosing a model
after signing in, you can pick from the latest GPT models available in your ChatGPT plan. higher tiers (Pro) unlock more capable models than Plus.
the model list updates automatically based on what your subscription includes.
## using it for pipes
pipes are automations that run on a schedule or on demand. when you connect your ChatGPT subscription, pipes use it automatically.
examples:
* **toggl sync** — auto-track time in Toggl based on your screen activity, every 30 minutes
* **day recap** — one-click summary of what you accomplished today
* **meeting summary** — summarize meeting transcripts with action items
to set up a pipe:
1. go to **pipes** in the sidebar
2. pick a pipe or create your own
3. in the pipe settings, select your ChatGPT preset
4. enable the pipe
## how it's different from MCP
screenpipe also supports [MCP integrations](/mcp-server) with ChatGPT Desktop, Claude, and other apps. that's a different thing:
| | ChatGPT subscription | MCP integration |
| ------------------ | -------------------------------------------------- | ------------------------------------------------------------------ |
| **what it does** | powers screenpipe's built-in AI chat and pipes | lets external apps (ChatGPT Desktop, Claude) query screenpipe data |
| **setup** | sign in with your OpenAI account inside screenpipe | add screenpipe as an MCP server in the external app |
| **where you chat** | in screenpipe's chat window | in the external app (ChatGPT Desktop, Claude, etc.) |
| **runs pipes** | yes | no |
you can use both at the same time.
## signing out
to disconnect your ChatGPT account:
1. open the model selector
2. click the **sign out** button next to your ChatGPT connection
this removes the stored tokens from your machine. your data stays local.
## troubleshooting
**sign-in window doesn't open?**
* make sure screenpipe is running
* try restarting the app and signing in again
**"could not get token" error?**
* your session may have expired — sign out and sign back in
* check that your ChatGPT subscription is active at [openai.com](https://openai.com)
**models not showing up?**
* sign out and sign back in to refresh your token
* some models are only available on higher subscription tiers
**pipes failing with auth errors?**
* tokens refresh automatically, but if it persists, sign out and back in
still stuck? [ask in our discord](https://discord.gg/screenpipe).
# Claude Code - AI coding with screen context
Source: https://docs.screenpipe.com/claude-code
Use screenpipe with Claude Code CLI to give Claude access to your screen history, meeting transcriptions, and app context while coding.
[Claude Code](https://code.claude.com) is Anthropic's official CLI for agentic coding. with screenpipe integration, Claude can reference what you've been working on, recall information from your screen, and access meeting transcriptions.
## setup
```bash theme={null}
claude mcp add screenpipe --transport stdio -- npx -y screenpipe-mcp
```
to make it available across all your projects:
```bash theme={null}
claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mcp
```
## verify connection
```bash theme={null}
# list MCP servers
claude mcp list
# or inside Claude Code, use
/mcp
```
## available tools
once connected, Claude Code has access to these tools:
| tool | description |
| ------------------ | --------------------------------------------------------------------------------------- |
| `search-content` | search screen text (accessibility-first, OCR fallback), audio transcriptions, and input |
| `activity-summary` | lightweight overview of app usage, speakers, and recent texts for a time range |
| `search-elements` | search structured UI elements from the accessibility tree |
| `frame-context` | full accessibility tree, URLs, and text for a specific frame |
| `list-meetings` | list detected meetings with duration, app, and attendees |
| `export-video` | export screen recordings as MP4 for a time range |
## usage examples
ask Claude Code to use screenpipe naturally:
```
> what was I looking at in my browser an hour ago?
> find mentions of "kubernetes" from my screen today
> show me audio transcriptions from my last meeting
> what code was I reading in VS Code yesterday about async?
> export a video of my screen from 2-3pm today
> what did I type in Slack today?
> show me my app usage stats for the past 2 hours
> what did I copy to clipboard recently?
> which apps did I switch between most today?
```
## search parameters
### search-content (vision + audio + input)
| parameter | description |
| ---------------- | ---------------------------------------------------------------------- |
| `q` | search query (optional - omit to get all content) |
| `content_type` | `vision`, `audio`, `accessibility`, `input`, or `all` (default: `all`) |
| `limit` | max results (default: 10) |
| `offset` | pagination offset |
| `start_time` | ISO 8601 UTC start time |
| `end_time` | ISO 8601 UTC end time |
| `app_name` | filter by app (e.g., "Chrome", "Slack") |
| `window_name` | filter by window title |
| `include_frames` | include base64 screenshots |
| `speaker_ids` | comma-separated speaker IDs for audio filtering |
| `speaker_name` | filter audio by speaker name |
## example workflows
**recall context from earlier:**
```
> I was reading a blog post about rust async earlier today,
> search screenpipe and summarize the key points
```
**reference meeting discussion:**
```
> search my audio transcriptions for what was discussed in standup
> about the API refactor, then help me implement it
```
**debug with screen history:**
```
> I saw an error message flash on screen, search screenpipe
> to find it and help me fix the issue
```
**find code examples:**
```
> search screenpipe for the python code I was looking at
> in the browser yesterday about asyncio patterns
```
**track what you typed:**
```
> what did I write in Notion this morning? search for my
> keyboard input using content_type=input
```
**recall clipboard history:**
```
> I copied something important earlier, search clipboard
> events to find it
```
## requirements
* screenpipe running on localhost:3030
* Claude Code CLI installed
* Node.js >= 18.0.0
## troubleshooting
**AI agent crashed with "Error: AI agent crashed — restarting automatically..."?**
this happens when Claude Code can't communicate with screenpipe or screenpipe encounters an error. try these steps in order:
1. **check screenpipe is running:**
```bash theme={null}
curl http://localhost:3030/health
```
you should see `{"status":"healthy"}`. if this fails, start screenpipe first.
2. **verify MCP is connected:**
```bash theme={null}
claude mcp list
```
you should see `screenpipe` in the list with status "ready".
3. **check screenpipe has recorded data:**
```bash theme={null}
curl "http://localhost:3030/search?limit=1"
```
if empty, screenpipe hasn't recorded anything yet—let it run for a minute and try again.
4. **restart the MCP connection:**
```bash theme={null}
claude mcp remove screenpipe
claude mcp add screenpipe --transport stdio -- npx -y screenpipe-mcp
```
5. **check screenpipe logs:**
* macOS/Linux: `~/.screenpipe/screenpipe.log`
* Windows: check event viewer or `%APPDATA%\screenpipe\logs`
**MCP not connecting?**
* verify screenpipe is running: `curl http://localhost:3030/health`
* check MCP status in Claude Code: `/mcp`
* remove and re-add: `claude mcp remove screenpipe && claude mcp add screenpipe --transport stdio -- npx -y screenpipe-mcp`
**queries returning empty?**
* check screenpipe has data: `curl "http://localhost:3030/search?limit=1"`
* ensure screen recording permissions are granted
* verify the time range you're querying
**permission errors?**
* macos: check System Settings > Privacy & Security > Screen Recording
* ensure screenpipe app is listed and enabled
still stuck? [ask in our discord](https://discord.gg/screenpipe).
# screenpipe REST API reference at localhost:3030
Source: https://docs.screenpipe.com/cli-reference
Complete REST API reference for screenpipe at localhost:3030 — search screen history, query frames, audio transcripts, tags, health, and more endpoints.
this is the REST API reference for `localhost:3030`; for CLI commands see the guides.
screenpipe serves a REST API on `localhost:3030`. use this to integrate with any tool or build custom automations.
for copy-paste workflows, start with [API recipes](/api-recipes). for the full interactive API reference with request/response schemas, see the API reference tab.
the local search endpoint is `/search`, not `/api/search`.
```bash theme={null}
curl "http://localhost:3030/search?limit=5"
```
## endpoints
### search & content
| method | endpoint | description |
| ------ | ------------------- | ----------------------------------------- |
| GET | `/search` | search screen & audio content |
| GET | `/search/keyword` | keyword search |
| GET | `/activity-summary` | compact activity readout for a time range |
| POST | `/raw_sql` | execute read-only SQL |
| POST | `/add` | add content to database |
### frames & elements
| method | endpoint | description |
| ------ | ----------------------- | -------------------------------------- |
| GET | `/frames/{id}` | get frame data |
| GET | `/frames/{id}/text` | get frame text and bounds |
| GET | `/frames/{id}/ocr` | get frame OCR fallback text and bounds |
| GET | `/frames/{id}/context` | get surrounding accessibility context |
| GET | `/frames/{id}/metadata` | get frame metadata |
| GET | `/frames/{id}/elements` | get UI elements for a frame |
| GET | `/elements` | search structured UI elements |
### meetings & speakers
| method | endpoint | description |
| ------ | ------------------- | ------------------------ |
| GET | `/meetings` | list meetings |
| GET | `/meetings/status` | meeting detection status |
| POST | `/meetings/merge` | merge meetings |
| GET | `/speakers/unnamed` | list unnamed speakers |
| POST | `/speakers/update` | rename a speaker |
| POST | `/speakers/merge` | merge speakers |
### memories
| method | endpoint | description |
| ------ | ----------- | --------------- |
| GET | `/memories` | list memories |
| POST | `/memories` | create a memory |
### devices & health
| method | endpoint | description |
| ------ | -------------- | --------------------- |
| GET | `/health` | server health check |
| GET | `/audio/list` | list audio devices |
| GET | `/vision/list` | list monitors |
| POST | `/audio/start` | start audio recording |
| POST | `/audio/stop` | stop audio recording |
### tags
| method | endpoint | description |
| ------ | ------------------- | ----------- |
| POST | `/tags/{type}/{id}` | add tags |
| DELETE | `/tags/{type}/{id}` | remove tags |
### retention, archive & deletion
| method | endpoint | description |
| ------ | ---------------------- | --------------------------------------- |
| GET | `/retention/status` | get retention status |
| POST | `/retention/configure` | configure retention policy |
| GET | `/archive/status` | get archive status |
| POST | `/archive/run` | run archive now |
| POST | `/data/delete-range` | permanently delete data in a time range |
## search example
```bash theme={null}
curl "http://localhost:3030/search?q=meeting&limit=10&content_type=all"
```
## search parameters
| param | type | description |
| ----------------- | -------- | ------------------------------------------------------------------------------------------------------- |
| `q` | string | search query |
| `limit` | int | max results |
| `offset` | int | pagination offset |
| `content_type` | string | `ocr`, `audio`, `input`, `accessibility`, `all` |
| `start_time` | ISO 8601 | filter start |
| `end_time` | ISO 8601 | filter end |
| `app_name` | string | filter by app |
| `window_name` | string | filter by window title |
| `browser_url` | string | filter by browser URL |
| `min_length` | int | minimum text length |
| `max_length` | int | maximum text length |
| `tags` | string | comma-separated; return only items carrying **all** of these tags, e.g. `tags=person:ada,project:atlas` |
| `include_related` | bool | with `tags`, attach a `related` block of co-occurring tags grouped by namespace |
### related context
pass `include_related=true` alongside a `tags` filter to get the tags that
co-occur with the ones you asked for — the people, projects, and workflows that
show up in the same frames, calls, and memories — in a single call instead of
several follow-up queries:
```bash theme={null}
curl "http://localhost:3030/search?tags=person:ada&include_related=true&limit=5"
```
```json theme={null}
{
"data": [ "...frames, audio, and memories..." ],
"pagination": { "limit": 5, "offset": 0, "total": 42 },
"related": {
"people": ["connor", "drew"],
"projects": ["atlas", "atlas-finance"],
"workflows": ["planning"]
}
}
```
namespaces are pluralized from the tag prefix (`person:` → `people`,
`project:` → `projects`); values are ordered most-frequent first. omit
`tags` and the block is skipped.
### content type guide
| content type | use it for |
| --------------- | ------------------------------------------------------------------------------- |
| `all` | first debugging pass; searches across available screen and audio data |
| `accessibility` | app text exposed by macOS/Windows accessibility APIs; best for most screen text |
| `ocr` | fallback pixel text when accessibility data is missing or incomplete |
| `audio` | transcripts and meeting/call content |
| `input` | keyboard/input-related records where available |
start with `content_type=all`. add `app_name`, `window_name`, or time filters only after you confirm broad search returns data.
## common API mistakes
| symptom | cause | fix |
| ------------------------------- | ---------------------------------------------- | ------------------------------------------------ |
| `404` on `/api/search` | wrong path | use `/search` |
| empty response after startup | capture has not processed yet | wait 1-2 minutes and retry |
| no result for a specific window | stored title differs | search broad, inspect `window_name`, then filter |
| OCR result missing app text | app exposes text through accessibility instead | try `content_type=accessibility` or `all` |
| pipe gets old data | schedule or time range too narrow | widen `start_time`/`end_time` or run manually |
## debugging
### enable verbose logging
to troubleshoot issues, enable debug logging by setting the `SCREENPIPE_LOG` environment variable before starting screenpipe:
**macOS/Linux:**
```bash theme={null}
SCREENPIPE_LOG=debug npx -y screenpipe@latest
```
**Windows (PowerShell):**
```powershell theme={null}
$env:SCREENPIPE_LOG = "debug"
npx -y screenpipe@latest
```
logs will print to the terminal. common log levels:
* `debug` — detailed diagnostic information
* `info` — general informational messages (default)
* `warn` — warnings only (less verbose)
you can also target specific modules for debugging:
```bash theme={null}
SCREENPIPE_LOG=screenpipe=debug,vision=debug npx -y screenpipe@latest
```
### check health endpoint
verify screenpipe is running properly:
```bash theme={null}
curl http://localhost:3030/health
```
### check pipe logs
for pipe-specific debugging, use the desktop app: **Pipes → My Pipes** → open your pipe → view logs.
need help? [join our discord](https://discord.gg/screenpipe).
# weekly client reports from real work
Source: https://docs.screenpipe.com/client-weekly-report
Build a client-ready weekly consulting report with active time, deliverables, decisions, risks, and next steps from a bounded screenpipe work history.
this workflow is for consultants, agencies, and fractional operators whose work is spread across calls, documents, code, email, and research. the output is a client-ready draft, not an automatic status message.
```mermaid theme={null}
flowchart TD
A["bounded week"] --> B["active time and project evidence"]
B --> C["draft outcomes, decisions, and risks"]
C --> D["consultant review"]
D --> E["client update"]
```
## step by step
Decide whether the client wants hours, outcomes, deliverables, decisions, risks, next steps, or some combination. agree on the reporting week and the detail that must stay private.
Review the week in the timeline. note missing days, unrecorded calls, travel, and work performed on another device so the report does not imply complete coverage.
Run `/activity-summary` for the exact reporting window. use its active-time totals; use AI only to suggest project labels. keep ambiguous blocks unassigned.
Search the same window for the project code, client name, document titles, pull requests, meetings, and delivery terms. prefer completed artifacts and accepted decisions over app usage alone.
“Opened the proposal” is activity. “Delivered proposal v2” is an outcome only when the source supports delivery. mark proposals, tentative dates, and inferred next steps clearly.
Check time totals, names, links, commitments, and deadlines. remove unrelated clients, personal messages, internal pricing, and raw transcript text.
Copy the approved version into email, Slack, or the client's portal. keep sending separate from generation until several reports are consistently accurate.
## create the reusable pipe
under **Pipes → My Pipes → create your own pipe**, paste:
```text theme={null}
Create a manual pipe that writes a weekly client report to a local Markdown file.
Use /activity-summary for numeric time totals and bounded /search results for context.
Include outcomes, deliverables, accepted decisions, risks, next steps, capture gaps,
and needs-review items. Separate observed facts from inferred project labels.
Exclude unrelated clients and personal activity. Never send the report or update
the client's systems.
```
run the generated pipe manually for one week, inspect the artifact and execution log, then correct its project terms before adding a schedule.
## report prompt
```markdown theme={null}
Create a client-ready weekly update from the supplied bounded screenpipe data.
Output:
1. executive summary
2. verified outcomes and deliverables
3. active time by day or workstream from activity-summary
4. accepted decisions
5. risks, blockers, and questions
6. next steps with owner and date only when supported
7. capture gaps and needs-review items
Do not convert screen activity into a claim of completion.
Do not include unrelated-client or personal content.
Return a draft only; do not send it.
```
use [consultant time tracking](/consultant-time-tracking) when time is the primary output. use this workflow when the client cares more about outcomes and next steps.
# cline - VS Code agent with screen memory
Source: https://docs.screenpipe.com/cline
Connect screenpipe to Cline via MCP to give this autonomous VS Code coding agent access to your screen history, meetings, and app context.
[Cline](https://github.com/cline/cline) is an autonomous AI coding agent for VS Code with 30k+ GitHub stars. it supports MCP servers, so you can connect screenpipe to give Cline context about what you've been working on across all your apps.
## setup
1. open VS Code with Cline installed
2. open Cline settings (gear icon in Cline panel)
3. go to **MCP Servers**
4. add screenpipe:
```json theme={null}
{
"mcpServers": {
"screenpipe": {
"command": "npx",
"args": ["-y", "screenpipe-mcp"]
}
}
}
```
5. click the refresh icon to reload MCP servers
## usage
once configured, Cline can search your screen history while coding:
```
> I was reading documentation about async/await patterns earlier,
> find it and help me apply those patterns here
> what error messages have I seen in my terminal today?
> find the API response format I was looking at in the browser
```
## plan mode with context
Cline's "Plan" mode works great with screenpipe:
1. switch to Plan mode
2. ask Cline to find relevant context from your screen history
3. let it create a plan based on what you've been working on
4. switch to Act mode to execute
```
> [Plan mode] I was researching authentication patterns earlier,
> find what I was looking at and plan how to implement it here
```
## available tools
screenpipe provides:
| tool | description |
| ------------------ | --------------------------------------------------------------------------------------- |
| `search-content` | search screen text (accessibility-first, OCR fallback), audio transcriptions, and input |
| `activity-summary` | lightweight overview of app usage, speakers, and recent texts for a time range |
| `search-elements` | search structured UI elements from the accessibility tree |
| `frame-context` | full accessibility tree, URLs, and text for a specific frame |
| `list-meetings` | list detected meetings with duration, app, and attendees |
| `export-video` | export screen recordings as MP4 for a time range |
## requirements
* screenpipe running on localhost:3030
* VS Code with Cline extension
* Node.js >= 18.0.0
need help? [join our discord](https://discord.gg/screenpipe).
# cloud archive - free disk space automatically
Source: https://docs.screenpipe.com/cloud-archive
Free disk space by encrypting old screenpipe screen recordings and uploading them to the cloud with zero-knowledge encryption — searchable on demand.
cloud archive encrypts your old screenpipe data and uploads it to the cloud, then deletes the local copy to free disk space. data is encrypted on your device with zero-knowledge encryption (argon2id key derivation + chacha20-poly1305) — we cannot read your data.
## how it works
choose how many days of data to keep locally (7, 14, 30, 60, or 90 days). data older than this will be archived.
your token is used to derive an encryption key locally using argon2id. data is encrypted with chacha20-poly1305 before upload — the same encryption used by cloud sync.
screenpipe uploads data in small batches (up to 500 records at a time) every 5 minutes. this includes screen captures, accessibility text, OCR fallback text, audio transcriptions, and ui events.
after each chunk is confirmed uploaded, the corresponding local data and media files are deleted to free disk space.
## what gets archived
frame metadata, app names, window titles, browser urls
accessibility text and OCR fallback text from screen recordings
transcribed speech with speaker and device info
ui text captured via accessibility apis
keyboard and mouse activity metadata
orphaned video/audio files are cleaned up after upload
## enabling cloud archive
1. open **settings → cloud archive**
2. select your retention period (how many days to keep locally)
3. toggle **enable cloud archive**
you can also trigger an immediate archive run by clicking **archive now** in the status card.
## encryption details
cloud archive reuses the same `SyncManager` and encryption pipeline as cloud sync:
* **key derivation**: argon2id with a password derived from your auth token
* **cipher**: chacha20-poly1305 (authenticated encryption)
* **zero-knowledge**: the encryption key never leaves your device
if you already have cloud sync enabled, archive uses the exact same encryption key to avoid any conflicts.
review the rust implementation of cloud archive
## watermark-based tracking
instead of marking individual records as uploaded, cloud archive uses a single **watermark timestamp**. all data before the watermark has been securely uploaded and can be safely deleted locally.
this is simpler and more efficient than per-record tracking — one timestamp tells the system exactly where it left off, even if the app restarts.
## storage & limits
your cloud storage usage is shown in the archive status card. storage limits depend on your screenpipe pro plan.
## get your data back
archived data is never stranded in the cloud. you can pull your entire archive back to disk in one click — every encrypted blob is downloaded and decrypted locally:
1. go to **settings → cloud archive**
2. click **download my archive** (may take several minutes depending on archive size)
3. monitor progress in the download status card
4. once complete, click **open folder** to view the files in finder
the archive is organized into two folders:
* **media/**: video clips (.mp4) and screenshots (.jpg)
* **metadata/**: json files containing transcriptions, accessibility text, and event logs
all data is decrypted locally during download — the same encryption key used for upload is applied in reverse.
download works even if cloud archiving is currently disabled, allowing you to retrieve previously archived data.
## important notes
cloud archive requires a screenpipe pro subscription. the archive process runs automatically in the background every 5 minutes when enabled.
## next steps
see exactly what leaves your device, and when
find anything you've seen, said, or heard
questions? [join our discord](https://discord.gg/screenpipe).
# connection reference: auth, proxies, and credentials
Source: https://docs.screenpipe.com/connection-reference
Reference for screenpipe app connections: available integrations, auth style, proxy usage, multi-account support, credential storage, and test queries.
connections give pipes and AI agents structured context from the source system, beyond what screenpipe can infer from visible app text.
## finding credentials
when setting up connections that require API keys, credentials, or URLs, screenpipe provides **direct help links** in the settings UI:
* look for the **?** icon next to each field (API Key, Webhook URL, etc.)
* hover or click to see "Learn how to find your X for this integration"
* select **Open guide →** to jump to that service's settings or API docs page
* no more hunting through documentation
this works for all API key, webhook, and custom credential fields.
## auth patterns
| pattern | examples | notes |
| -------------------------- | ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| OAuth | Outlook, Google Calendar, Google Docs, Notion, Jira, Microsoft 365, Teams, Vercel, Supabase, Zoom, HubSpot | best user experience; tokens are stored locally; no API key needed |
| API key | Linear, PostHog, Sentry, Stripe, Toggl, Pipedrive, Glean, Mochi | simple and reliable; help links guide you to API settings pages; rotate keys if a device is lost |
| webhook URL | n8n, Make, Zapier, Pushover, ntfy, Resend | best for one-way notifications or workflow triggers |
| app password | Email Inbox (IMAP) | read-only inbox access without OAuth; for Gmail, create one at myaccount.google.com/apppasswords (requires 2-Step Verification) |
| local path | Obsidian, Logseq | keeps notes local |
| custom/private CA | Bee | screenpipe includes the required trust configuration for the provider |
| managed OAuth via Composio | Gmail, Zoom, Google Drive, Google Docs, Google Sheets | one-click sign-in managed by composio.dev (SOC 2), available on every plan. Sign-in and data access run through Composio's cloud, and the agent reaches these through the shared Composio MCP server (sp\_mcp tools), not the connection proxy |
## credential storage
screenpipe stores connection credentials in the local secure store when available. environments without the secure store can fall back to `~/.screenpipe/connections.json`.
pipe prompts should not contain secrets. prefer connected app proxies:
```bash theme={null}
curl "http://localhost:3030/connections//proxy/"
```
screenpipe injects the credential on the local side, so the AI sees the request shape but not the secret value.
## available integrations
The app registry currently includes these connection IDs:
| category | integrations |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| communication | Slack, Discord, Email (SMTP), Email Inbox (IMAP), Gmail (via Composio), Outlook, Telegram, WhatsApp, Microsoft Teams, Zoom (via Composio) |
| productivity | Notion, Obsidian, Google Calendar, Google Docs, Google Drive (via Composio), Google Sheets (via Composio), Microsoft 365, Logseq, Workflowy, Airtable, Confluence, Odoo, Mochi, Hermes |
| project management | Linear, Jira, Asana, Monday.com, Trello, ClickUp, Todoist, Cal.com, Calendly |
| CRM and support | HubSpot, Salesforce, Pipedrive, Intercom, Zendesk, Bitrix24 |
| developer and ops | GitHub, Sentry, Vercel, Supabase, PostHog |
| finance | Stripe, Brex, QuickBooks Online, Financial Sense |
| meeting and voice | Granola, Fireflies.ai, Otter.ai, Limitless, Bee, Pocket, Leexi |
| automation and notifications | n8n, Make, Zapier, Pushover, ntfy, Loops, Resend |
| AI and knowledge | Perplexity, Glean, Readwise |
| AI assistant memory | Claude Code, Codex CLI, Obsidian Memories |
| AI agent gateway | OpenClaw |
## multi-account support
use named instances when you have more than one account for the same service:
| example | use |
| ----------------------------------------------------- | ------------------------------------- |
| `notion:work` and `notion:personal` | separate work and personal workspaces |
| `google-calendar:work` and `google-calendar:personal` | separate calendars |
| `hubspot:prod` and `hubspot:sandbox` | separate CRM portals |
| `posthog:screenpipe` and `posthog:bench` | separate analytics projects |
Composio-managed integrations (Gmail, Zoom, Google Drive/Docs/Sheets) also support multiple accounts: use **connect another account** on the integration card and give each account a label (for example `work`, `personal`). Up to 5 accounts per integration. The AI uses the most recently connected account by default and targets a specific one when you name it ("check my work gmail").
## test queries
after connecting, run a tiny request before relying on a pipe:
```bash theme={null}
curl "http://localhost:3030/connections/google-calendar/events?hours_ahead=8"
curl "http://localhost:3030/connections/notion/proxy/v1/users/me"
curl "http://localhost:3030/connections/hubspot/proxy/crm/v3/objects/contacts?limit=1"
curl "http://localhost:3030/connections/linear/proxy/graphql"
curl "http://localhost:3030/connections/readwise/proxy/api/v2/auth/"
curl "http://localhost:3030/connections/imap/messages?limit=5"
```
Email Inbox (IMAP) is not proxied (IMAP is not HTTP) — use its dedicated read-only endpoints: `/connections/imap/messages`, `/connections/imap/messages/{uid}`, and `/connections/imap/mailboxes`.
exact provider paths follow the provider API. if a request fails, reconnect the integration first, then check the provider's own permissions.
## OAuth callback troubleshooting
OAuth redirects back to:
```text theme={null}
http://localhost:3030/connections/oauth/callback
```
if OAuth fails:
1. keep screenpipe open during the login flow.
2. check `curl http://localhost:3030/health`.
3. make sure the browser did not block the redirect.
4. reconnect from settings -> connections.
5. check whether the provider account type is supported. Microsoft Teams, for example, needs a work or school account.
## choosing the right connection
| need | connect |
| ---------------------------- | --------------------------------------- |
| better speaker names | Google Calendar |
| CRM follow-up after calls | HubSpot, Salesforce, Pipedrive, Notion |
| daily notes and highlights | Obsidian, Logseq, Google Docs, Readwise |
| product analytics context | PostHog, Sentry, GitHub, Vercel |
| finance or billing workflows | Stripe, Brex, QuickBooks |
| meeting import | Zoom, Fireflies.ai, Granola, Otter.ai |
| notifications | Slack, Pushover, ntfy, Resend |
## related pages
* [connections](/connections)
* [pipe debugging](/pipe-debugging)
* [meeting intelligence](/meeting-intelligence)
* [privacy data flow](/privacy-data-flow)
# connect Slack, Notion, Calendar, and other apps
Source: https://docs.screenpipe.com/connections
Connect apps to screenpipe — Slack, Notion, Google Calendar, Obsidian, HubSpot, Salesforce, Zoom, PostHog, and Sentry — to give AI agents structured context.
screenpipe captures your screen and audio by default. but you can also connect your apps directly — this gives pipes and AI agents richer, structured data from the source.
for the complete registry, auth patterns, multi-account examples, and proxy test calls, use the [connection reference](/connection-reference).
## how to connect apps
open screenpipe → click **settings** (gear icon, bottom of sidebar) → scroll to **Data & Privacy** → click **Connections**.
you'll see all available integrations. click one to configure credentials or start an OAuth flow.
### finding API keys & credentials
for integrations that require API keys or other credentials, screenpipe provides **help links** next to each field:
* look for the **?** icon next to the field label (e.g., "API Key")
* hover over it to see "Learn how to find your API Key for this integration"
* click **Open guide →** to jump directly to that app's settings page
this takes you straight to where you need to be — no more hunting through docs.
**oauth integrations** (Slack, Notion, Google Calendar, etc.) skip the API key step entirely — just click the big "Connect with \[App]" button and approve access in your browser.
some pipes require specific connections. when you install a pipe that needs a connection (like Notion or Toggl), screenpipe will prompt you to configure it automatically.
## available integrations
this is a quick reference of common integrations. for the complete, canonical list of every supported integration — with auth style, proxy paths, and multi-account examples — see the [connection reference](/connection-reference).
### communication
| app | description |
| ------------------- | ------------------------------------------------- |
| **Slack** | access messages, channels, and threads |
| **Discord** | access server messages and channels |
| **Email** | connect your email for context |
| **Telegram** | access Telegram messages |
| **WhatsApp** | access WhatsApp conversations |
| **Microsoft Teams** | access Teams messages and channels |
| **Zoom** | access Zoom meeting metadata and cloud recordings |
### productivity & project management
| app | description |
| ------------------- | ---------------------------------------------------------- |
| **Notion** | read and write to Notion databases and pages |
| **Obsidian** | sync daily logs, meeting notes, and journals to your vault |
| **Google Calendar** | enrich meetings with attendees and schedule context |
| **Google Docs** | read and write Google Docs through OAuth |
| **Linear** | access issues and projects |
| **Todoist** | manage tasks and projects |
| **Asana** | access tasks and projects |
| **Monday.com** | access boards and items |
| **Trello** | access boards and cards |
| **ClickUp** | access tasks and spaces |
| **Jira** | access issues and projects |
| **Confluence** | access pages and spaces |
| **Airtable** | access bases and records |
| **Logseq** | sync with your Logseq graph |
| **Odoo** | query and update ERP, CRM, sales, and project records |
### CRM & sales
| app | description |
| -------------- | ------------------------------------ |
| **HubSpot** | sync contacts, deals, and activities |
| **Salesforce** | access CRM data and records |
| **Pipedrive** | sync deals and contacts |
| **Intercom** | access conversations and contacts |
| **Zendesk** | access tickets and customers |
### calendar & scheduling
| app | description |
| ------------------- | ---------------------------------------- |
| **Google Calendar** | access your calendar events and schedule |
| **Calendly** | access scheduling data |
| **Cal.com** | access scheduling data |
### developer tools
| app | description |
| ----------------- | -------------------------------------------- |
| **GitHub Issues** | access issues across repositories |
| **Sentry** | access error tracking and alerts |
| **Vercel** | access deployment data |
| **Stripe** | access payment and subscription data |
| **PostHog** | access product analytics and event data |
| **Supabase** | access projects, storage, and edge functions |
### automation platforms
| app | description |
| ---------- | ------------------------------------------ |
| **n8n** | trigger n8n workflows from screenpipe |
| **Make** | trigger Make scenarios from screenpipe |
| **Zapier** | trigger Zapier automations from screenpipe |
### time tracking
| app | description |
| --------- | ---------------------------------------- |
| **Toggl** | auto-track time based on screen activity |
### notifications
| app | description |
| ------------ | --------------------------- |
| **Pushover** | send push notifications |
| **ntfy** | send notifications via ntfy |
### AI & knowledge
| app | description |
| ---------------- | ----------------------------------------- |
| **Perplexity** | access AI search results |
| **Glean** | connect enterprise knowledge |
| **Granola** | sync meeting notes |
| **Limitless** | sync Limitless data |
| **Fireflies.ai** | pull meeting transcripts and action items |
| **Otter.ai** | connect cloud meeting transcripts |
| **Bee** | connect Bee wearable captures |
### other
| app | description |
| --------------------- | ------------------------------ |
| **Brex** | access financial data |
| **Microsoft 365** | access Office apps data |
| **QuickBooks Online** | access company accounting data |
## multi-account support
you can connect multiple accounts for the same app using instance names. for example, connect both your work and personal Notion:
* `notion:work` — your company workspace
* `notion:personal` — your personal workspace
this is configured in the connections UI when adding a new integration.
## use connections from pipes
connections can expose a local proxy endpoint so pipes can call third-party APIs without putting secrets in the prompt:
```bash theme={null}
curl "http://localhost:3030/connections/google-calendar/events?hours_ahead=8"
curl "http://localhost:3030/connections/hubspot/proxy/crm/v3/objects/contacts?limit=1"
curl "http://localhost:3030/connections/notion/proxy/v1/users/me"
```
see [connection reference](/connection-reference) and [pipe debugging](/pipe-debugging) for safe proxy patterns.
## AI tool connections (MCP)
these are different from app connections — they let you use screenpipe's data inside external AI tools:
| tool | what it does | setup |
| ------------------ | -------------------------------------------------------- | -------------------------- |
| **Claude Desktop** | ask Claude about your screen history | [MCP setup →](/mcp-server) |
| **Claude Code** | give Claude Code access to your screen context | [guide →](/claude-code) |
| **Cursor** | add screen context to Cursor's AI | [MCP setup →](/mcp-server) |
| **ChatGPT** | use your ChatGPT subscription in screenpipe chat + pipes | [guide →](/chatgpt) |
| **Ollama** | use local models for complete privacy | [guide →](/ollama) |
you can use both app connections AND AI tool connections at the same time. connect Google Calendar + Obsidian as data sources, AND connect Claude Desktop to query everything.
## why connect apps?
without connections, screenpipe captures what's visible on your screen. with connections, pipes get structured data directly from the source:
| without connections | with connections |
| ------------------------------------ | ------------------------------------------------------ |
| sees calendar when you look at it | knows your full schedule, upcoming meetings, attendees |
| sees Notion pages via screen capture | reads and writes to Notion databases directly |
| sees CRM data when you open it | auto-syncs contacts and deals after every call |
this makes pipes significantly more accurate and useful.
## troubleshooting
### Google OAuth: "app isn't verified" or "unsafe"
when connecting Google Calendar or Google Docs, you may see a warning that says the app is "unverified" or "unsafe." this is normal — screenpipe is a local app and Google requires additional verification steps for third-party apps.
**how to proceed:**
1. on the Google warning screen, click **Advanced** (bottom-left corner)
2. click **Go to Screenpipe (unsafe)** to continue with the connection
3. screenpipe will not be marked unsafe once you verify the connection — this is a standard OAuth security flow
if the page closes or doesn't load, check that:
* you have internet connectivity
* no browser extensions are blocking the OAuth redirect
* your firewall isn't blocking `localhost:3030` (the local callback endpoint)
### connection fails silently
if a connection appears to connect but then disappears:
* check that Pro is active (OAuth requires a Pro subscription)
* verify the app credentials are correct by disconnecting and reconnecting
* check app permissions in the original service (e.g., Notion workspace settings, Slack workspace admin console) — you may need to re-approve access
### "not connected" error in pipes
if a pipe reports that a connection isn't available:
* confirm the connection is active in **settings → connections** (green dot or "connected" status)
* for multi-account setups, verify the pipe is using the correct instance name (e.g., `notion:work` vs `notion:personal`)
* try reconnecting: disconnect and reconnect the app
* check the [pipe debugging guide](/pipe-debugging) for troubleshooting pipe-specific issues
## privacy & security
* OAuth connections use standard OAuth flows — screenpipe stores tokens locally in your secure store when available
* CLI-like environments can fall back to local `~/.screenpipe/connections.json`
* connected app data stays on your device
* you can disconnect any app at any time in **settings → connections**
* screenpipe never sends your connected app data to our servers
* OAuth connections require a Pro subscription
questions? [join our discord](https://discord.gg/screenpipe).
# consultant time tracking
Source: https://docs.screenpipe.com/consultant-time-tracking
Track consultant hours across calls, docs, code, and browsers with screenpipe. Produce a reviewed client time report without invasive monitoring.
use screenpipe to reconstruct work across calls, documents, code, email, and browser research. the goal is a defensible draft report—not a surveillance score or an invoice sent without review.
## a good first pilot
| scope | recommendation |
| ---------- | ------------------------------------------------------------------- |
| person | one consultant on their own device |
| work | one client or project |
| duration | one to two weeks |
| output | date, active minutes, work blocks, deliverables, and uncertain time |
| acceptance | consultant reviews it; client agrees the level of detail is useful |
```mermaid theme={null}
flowchart TD
A["local screen and audio"] --> B["authoritative active time"]
A --> C["AI project labels"]
B --> D["draft client report"]
C --> D
D --> E["consultant review"]
E --> F["timesheet or invoice input"]
```
## step by step
Define the project, working hours, excluded apps, retention period, and whether the client should receive narrative detail or only totals. do not capture a client's device or employees without their authorization and a clear policy.
Open **Settings → Privacy**. exclude password managers, personal messaging, banking, health, unrelated clients, and any confidential surface that is not needed for the report.
Record 15–30 minutes of representative work. confirm the timeline contains the expected apps and that audio is captured only when needed.
Use `/activity-summary` for numeric totals. let the model classify the resulting blocks by client or project, but never let it manufacture time from the number of frames or search results.
Search the same time range for project terms, document titles, meetings, and deliverables. keep ambiguous blocks in an “unassigned” section instead of forcing a label.
Check totals against your calendar and known breaks. remove unrelated detail, correct project labels, and mark estimates clearly.
Export the reviewed result to your normal timesheet or attach it to an invoice. automate this handoff only after several accurate manual reports.
## API example
```bash theme={null}
export SCREENPIPE_API_KEY="$(npx -y screenpipe@latest auth token)"
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" \
"http://localhost:3030/activity-summary?start_time=4h+ago&end_time=now"
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" \
"http://localhost:3030/search?q=project-or-client-code&content_type=all&start_time=4h+ago&end_time=now&limit=50"
```
relative ranges such as `4h ago` and `now` are convenient for a first test. use ISO 8601 UTC timestamps when the report must match an exact calendar or billing window, and replace the project code with your own value.
## build it without code
Go to **Pipes → My Pipes** and scroll to **create your own pipe**.
Paste: “Create a manual pipe that writes a local client work report. use `/activity-summary` for numeric totals, bounded `/search` results for context, put ambiguous time in needs review, and never send or invoice automatically.”
The app opens Home, asks the agent to create the pipe, and installs the result. when it finishes, return to **Pipes → My Pipes**.
Open the new pipe, run it once, and inspect its Markdown artifact and execution log. confirm that an empty window produces an explicit no-data report.
Keep the first version manual. add a daily or weekly schedule only after several reports have correct totals and project labels.
the generated automation is a `pipe.md` file under `~/.screenpipe/pipes/`. advanced users can inspect and version that file; the [pipes guide](/pipes) explains its schedule, permissions, and artifacts.
## prompt for the report
```markdown theme={null}
Create a draft client work report from the supplied activity summary and search results.
Rules:
- use activity-summary values for numeric time totals
- group work into coherent blocks, not individual frames
- separate observed facts from inferred project labels
- put ambiguous time in "needs review"
- exclude personal or unrelated-client content
- list deliverables and decisions only when the source data supports them
Output:
1. total active time
2. table of work blocks: time, project, activity, supporting app or document
3. deliverables and decisions
4. needs-review items
```
## what not to automate first
do not start by sending reports, creating invoices, writing to a client's system, or synchronizing every inferred block to a time tracker. save a local draft and review it first. once the labels are stable, an optional store pipe can copy reviewed entries into another system.
for a daily personal view, use [daily work review](/daily-work-review). for finding repeated client processes, continue with [workflow discovery](/workflow-discovery).
# continue - open-source copilot with screen context
Source: https://docs.screenpipe.com/continue
Set up screenpipe with Continue, the open-source AI copilot for VS Code and JetBrains, so it can reference your screen history while you code.
[Continue](https://github.com/continuedev/continue) is an open-source AI coding assistant with 20k+ GitHub stars. it works in VS Code and JetBrains IDEs, and supports MCP servers for external context.
## setup
### VS Code
1. install Continue from the VS Code marketplace
2. open Continue settings
3. edit `~/.continue/config.json`:
```json theme={null}
{
"mcpServers": [
{
"name": "screenpipe",
"command": "npx",
"args": ["-y", "screenpipe-mcp"]
}
]
}
```
4. restart VS Code
### JetBrains
1. install Continue from JetBrains marketplace
2. open Continue settings
3. add the same MCP configuration
4. restart the IDE
## usage
once configured, Continue can access your screen history:
```
> @screenpipe what was I working on this morning?
> find the error I saw in my terminal and help me fix it
> what documentation was I reading about react hooks?
```
## example workflows
**code with context:**
```
> I was looking at how another project handles authentication,
> find that code and help me implement something similar
```
**recall errors:**
```
> there was a typescript error earlier about types,
> find it and explain how to fix it
```
**meeting follow-up:**
```
> what did we discuss in the standup about the API changes?
> help me implement those changes
```
## available tools
via MCP, Continue gets access to:
| tool | description |
| ------------------ | --------------------------------------------------------------------------------------- |
| `search-content` | search screen text (accessibility-first, OCR fallback), audio transcriptions, and input |
| `activity-summary` | lightweight overview of app usage, speakers, and recent texts for a time range |
| `search-elements` | search structured UI elements from the accessibility tree |
| `frame-context` | full accessibility tree, URLs, and text for a specific frame |
| `list-meetings` | list detected meetings with duration, app, and attendees |
| `export-video` | export screen recordings as MP4 for a time range |
## requirements
* screenpipe running on localhost:3030
* Continue extension in VS Code or JetBrains
* Node.js >= 18.0.0
## troubleshooting
**MCP server not appearing in Continue?**
1. check screenpipe is running:
```bash theme={null}
curl http://localhost:3030/health
```
you should see `{"status":"healthy"}`
2. verify the config file location:
* VS Code: `~/.continue/config.json` (check it exists and is valid JSON)
* JetBrains: open Continue settings and confirm the MCP config is saved
3. restart the IDE completely (not just the Continue extension)
4. if the server still doesn't appear, remove and re-add it in Continue settings
**screenpipe queries returning empty?**
* verify screenpipe has data:
```bash theme={null}
curl "http://localhost:3030/search?limit=1"
```
if empty, screenpipe hasn't recorded anything yet — let it run for a minute and try again
* check screen recording permissions are granted (System Settings on macOS)
* confirm you're querying a time range with recorded data
**"Error calling tool" in Continue?**
* check the screenpipe process is still running (it may have crashed):
```bash theme={null}
curl http://localhost:3030/health
```
* check screenpipe logs:
* macOS/Linux: `~/.screenpipe/screenpipe.log`
* Windows: check event viewer or `%APPDATA%\screenpipe\logs`
* restart screenpipe if needed:
```bash theme={null}
npx -y screenpipe@latest record
```
**VS Code extension not showing MCP tools?**
* reload the Continue extension: use VS Code's Command Palette (Cmd+Shift+P) → "Reload Window"
* verify `config.json` is valid JSON (check for trailing commas)
* ensure Node.js >= 18.0.0: `node --version`
still stuck? [join our discord](https://discord.gg/screenpipe).
# contribute to screenpipe - local-first screen recording
Source: https://docs.screenpipe.com/contributing
Contribute to screenpipe: report bugs, submit pull requests, join bounty programs, and help build the local-first screen recording platform.
for detailed contribution guidelines, build instructions, and development setup, please see our [contributing guide on github](https://github.com/screenpipe/screenpipe/blob/main/CONTRIBUTING.md).
### quick links
* [report a bug](https://github.com/screenpipe/screenpipe/issues/new?labels=bug)
* [request a feature](https://github.com/screenpipe/screenpipe/issues/new?labels=enhancement)
* [join our discord](https://discord.gg/screenpipe)
* [schedule a call](https://cal.com/team/screenpipe/chat)
# GitHub Copilot CLI — agentic coding with screen context
Source: https://docs.screenpipe.com/copilot-cli
Connect screenpipe to GitHub Copilot CLI via MCP so Copilot can reference your screen history, meeting transcriptions, and app context from the terminal.
[GitHub Copilot CLI](https://docs.github.com/en/copilot/concepts/agents/about-copilot-cli) is GitHub's terminal-based AI coding agent. it supports MCP servers, so you can connect screenpipe and let Copilot reference what you've been seeing, hearing, and doing.
## setup
before setting up, make sure screenpipe is running on your machine:
```bash theme={null}
npx -y screenpipe@latest record
```
check that it's running:
```bash theme={null}
curl http://localhost:3030/health
```
the easiest way to connect is the built-in `/mcp add` slash command inside Copilot CLI:
```
/mcp add
```
fill in the prompts:
| field | value |
| ------- | ------------------- |
| name | `screenpipe` |
| type | `local` |
| command | `npx` |
| args | `-y screenpipe-mcp` |
| tools | `*` |
or edit `~/.copilot/mcp-config.json` directly:
```json theme={null}
{
"mcpServers": {
"screenpipe": {
"type": "local",
"command": "npx",
"args": ["-y", "screenpipe-mcp"],
"tools": ["*"]
}
}
}
```
restart Copilot CLI after editing the config.
## stdio vs http — which should I use?
**use stdio** (`type: "local"` in config). this is the standard for local MCP servers on the same machine. screenpipe runs locally on your machine, so stdio communication has no network overhead and is the intended pattern.
HTTP transport is only for remote scenarios where your MCP client (Claude, Cursor, etc.) runs on a different machine than screenpipe — see [openclaw](/openclaw) for that pattern. **for Copilot CLI on the same machine, always choose stdio.**
## verify connection
inside Copilot CLI, run:
```
/mcp
```
you should see `screenpipe` listed with its tools.
## available tools
| tool | description |
| ------------------ | --------------------------------------------------------------------------------------- |
| `search-content` | search screen text (accessibility-first, OCR fallback), audio transcriptions, and input |
| `activity-summary` | lightweight overview of app usage, speakers, and recent texts for a time range |
| `search-elements` | search structured UI elements from the accessibility tree |
| `frame-context` | full accessibility tree, URLs, and text for a specific frame |
| `list-meetings` | list detected meetings with duration, app, and attendees |
| `export-video` | export screen recordings as MP4 for a time range |
## usage examples
ask Copilot CLI to use screenpipe naturally:
```
> what was I working on this morning?
> find the error message I saw in my terminal earlier
> summarize the kubernetes docs I was reading
> export a video of my screen from 2-3pm today
> what did the team discuss in standup about the API refactor?
> which apps did I switch between most today?
```
## example workflows
**recall context from earlier:**
```
> I was reading a blog post about rust async earlier today,
> search screenpipe and summarize the key points
```
**reference meeting discussion:**
```
> search my audio transcriptions for what was discussed in standup
> about the API refactor, then help me implement it
```
**debug with screen history:**
```
> I saw an error message flash on screen, search screenpipe
> to find it and help me fix the issue
```
## requirements
* screenpipe running on localhost:3030 (start with `npx -y screenpipe@latest record`)
* GitHub Copilot CLI installed
* Node.js >= 18.0.0
## troubleshooting
**how do I check I'm on the latest screenpipe CLI?**
always invoke screenpipe with the `@latest` npm tag — it pulls the freshest build from npm each time:
```bash theme={null}
npx -y screenpipe@latest record
```
check the version you're running:
```bash theme={null}
npx -y screenpipe@latest --version
```
**MCP not connecting?**
1. verify screenpipe is running:
```bash theme={null}
curl http://localhost:3030/health
```
you should see `{"status":"healthy"}`.
2. confirm Copilot sees the server:
```
/mcp
```
3. remove and re-add via `/mcp` if the server is in an error state.
**queries returning empty?**
* check screenpipe has data: `curl "http://localhost:3030/search?limit=1"`
* ensure screen recording permissions are granted
* give screenpipe a minute or two of running before querying
**permission errors on macOS?**
* System Settings → Privacy & Security → Screen Recording → enable for your terminal
still stuck? [ask in our discord](https://discord.gg/screenpipe).
# daily work review
Source: https://docs.screenpipe.com/daily-work-review
Turn a day of screen and meeting activity into a private recap, standup draft, or open-loops list using screenpipe timeline search and Home pipes.
a daily review helps when work is spread across terminals, documents, browsers, calls, and messages. screenpipe reconstructs the day; you decide what it means and what is safe to share.
## choose the output
| output | useful when | keep private by default |
| --------------- | ------------------------------------- | ------------------------------------------------ |
| personal recap | remembering progress and context | detailed app, document, and conversation history |
| standup draft | reporting work to a team | unrelated projects and personal activity |
| open-loops list | planning tomorrow | guesses about commitments or owners |
| weekly review | spotting patterns across several days | raw screen or transcript excerpts |
## step by step
Open the timeline and confirm the expected work periods were captured. gaps should appear as gaps in the report.
Use **Day Recap** on Home. use **Time Breakdown** when you need an app and project view, or **Missed To-Dos** when you need open loops. review the result before turning it into a recurring pipe.
Include completed work, decisions, blockers, unfinished tasks, and likely next actions. require the result to distinguish direct evidence from inference.
Remove private details, correct project names, and delete activity that is not relevant to the audience.
Keep a personal recap in a local file, or copy the shorter standup into your team's tool. a generated draft should not post itself on the first run.
## current Home shortcuts
accomplishments, key moments, and unfinished work
app, category, and project breakdown for a bounded day
likely unresolved commitments from recent work
one repeated workflow and a testable automation candidate
## prompt for a private recap
```markdown theme={null}
Review today's bounded screenpipe data.
Create:
1. completed work, grouped by project
2. meetings, decisions, and commitments
3. blockers and unresolved questions
4. open loops with the source time range
5. suggested priorities for tomorrow
Rules:
- report capture gaps as gaps
- do not infer completion from merely viewing a task
- mark suggested priorities as suggestions
- avoid quoting private messages unless necessary
```
## prompt for a standup draft
```markdown theme={null}
Turn today's verified recap into a standup under 150 words:
- completed
- next
- blockers
Include only work appropriate for my team channel.
Do not include personal activity, unrelated clients, or uncertain commitments.
Return a draft for review; do not send it.
```
## schedule it later
after several accurate runs, schedule the pipe near the end of your workday. save the full result locally and keep external posting as a separate, reviewed step.
if the report needs billable totals, use [consultant time tracking](/consultant-time-tracking). if it should become long-term AI context, use [local agent memory](/agent-memory-workflow).
# docs maintenance guide for screenpipe contributors
Source: https://docs.screenpipe.com/docs-maintenance
How screenpipe maintainers keep docs synced with product changes, OpenAPI routes, app connections, UI screenshots, and changelog release notes.
screenpipe moves quickly. every user-facing change should leave the docs in a better state than it found them.
## release docs checklist
for every release PR or feature PR, check:
| change type | docs update |
| -------------------------- | -------------------------------------------------------------------------------------------- |
| new setting or UI flow | relevant guide plus screenshot if it changes the user path |
| new API route or parameter | OpenAPI plus [API recipes](/api-recipes) if user-facing |
| new connection | [connections](/connections) and [connection reference](/connection-reference) |
| new pipe behavior | [pipes](/pipes), [pipe debugging](/pipe-debugging), or [pipe permissions](/pipe-permissions) |
| meeting feature | [meeting intelligence](/meeting-intelligence) |
| privacy/security behavior | [privacy data flow](/privacy-data-flow) and [privacy filter](/privacy-filter) |
| platform reliability fix | [troubleshooting](/troubleshooting) |
| enterprise control | [teams](/teams) or deployment docs |
## validation
run:
```bash theme={null}
node docs/mintlify/validate-docs.mjs
```
this checks:
* `docs.json` is valid JSON
* every nav page exists
* no MDX page is missing from nav
* each MDX file has frontmatter with `title` and `description`
* internal docs links point to a known page or public asset
* `openapi.yaml` contains routes
* the connection registry can be read from code
## screenshot workflow
screenshots come from app e2e specs:
```bash theme={null}
cd apps/screenpipe-app-tauri
bun run wdio run e2e/wdio.conf.ts \
--spec e2e/specs/home-window.spec.ts \
--spec e2e/specs/settings-sections.spec.ts \
--spec e2e/specs/pipes.spec.ts
```
copy selected images from `apps/screenpipe-app-tauri/e2e/screenshots/` into:
```text theme={null}
docs/mintlify/docs-mintlify-mig-tmp/public/app-screenshots/
```
then reference them as:
```mdx theme={null}
```
## ownership map
| area | owner checklist |
| --------------- | --------------------------------------------------------- |
| get started | first value, permissions, desktop vs CLI |
| MCP | client setup, auth, restart requirements, troubleshooting |
| API | generated OpenAPI, tested recipes, auth examples |
| pipes | lifecycle, permissions, logs, store, publishing |
| connections | registry drift, OAuth, proxy paths, multi-account |
| meetings | transcript, speakers, summaries, calendar context |
| privacy | local/cloud data flow, PII, deletion, LAN access |
| enterprise | teams, managed presets, deployment, encryption |
| troubleshooting | symptom-first fixes by platform |
## drift rules
* if a route is added to code, OpenAPI and docs should mention it or intentionally keep it reference-only.
* if a connection is added to `screenpipe-connect`, docs must include it in the reference.
* if release notes mention a feature, the durable guide should also explain how to use it.
* if a screenshot changes materially, update the image in the same PR.
# screenpipe FAQ: install, permissions, pipes, and privacy
Source: https://docs.screenpipe.com/faq
Answers to common screenpipe questions on install, screen and mic permissions, Zoom and Teams transcription, pipes, AI keys, Ollama, and privacy.
this FAQ is organized around the questions people ask support most often: what to try first, how billing works, why installs or pipes fail, how meetings and audio behave, and how privacy works when AI or cloud features are enabled.
## start here
| if you want to... | read this |
| -------------------------------------------- | ----------------------------------------------------------- |
| get value in the first hour | [quickstart](/quickstart), then [use cases](/use-cases) |
| fix install, login, empty timeline, or audio | [troubleshooting](/troubleshooting) |
| debug a custom pipe | [pipe debugging](/pipe-debugging) |
| connect Claude, Codex, Cursor, or ChatGPT | [MCP server](/mcp-server) |
| check what data leaves your computer | [privacy data flow](/privacy-data-flow) |
| deploy to a team | [teams](/teams) and [Intune deployment](/intune-deployment) |
## getting value
start with one repeated workflow, not every feature.
good first workflows:
* **daily recap**: ask "what did I work on today?" or install a daily-summary pipe
* **meeting memory**: turn on audio, join one Zoom/Meet/Teams call, then search the transcript
* **AI memory**: connect Claude Desktop, Codex, Cursor, or another MCP client and ask about the last 10 minutes
* **SOP capture**: do one repeated process while screenpipe records, then ask AI to turn it into a step-by-step guide
the fastest team pilot is usually: one person, one repeated workflow, one week, one written output.
pipes are scheduled AI agents that run on your screenpipe data. each pipe is usually a `pipe.md` prompt plus a schedule. it can search your local screen/audio history, summarize work, write notes, send notifications, or call connected apps.
examples:
* write a daily Obsidian note
* summarize meetings and draft follow-up emails
* monitor a specific app or window for changes
* sync activity to Notion, HubSpot, Toggl, or another tool
see [pipes](/pipes), [pipe store](/pipe-store), and [pipe debugging](/pipe-debugging).
screenpipe gives AI tools a searchable memory of what was on your screen, what apps you used, and what was said in meetings. when a chat or coding agent loses context, it can ask screenpipe for recent activity instead of relying only on the current conversation.
the usual setup is:
1. install screenpipe and let it capture a few minutes of activity.
2. connect your AI tool through [MCP](/mcp-server).
3. ask questions like "what was I doing before this chat compacted?" or "find the error message I saw in the terminal."
screenpipe does not magically recover hidden model context. it gives the AI a local memory source it can search.
yes. record one clean run of the workflow, then ask a pipe or AI assistant to summarize the steps using screen text, app names, timestamps, and transcript evidence.
best first SOP prompt:
```markdown theme={null}
Search the last 45 minutes of screenpipe data.
Turn the workflow into an SOP for a new teammate.
Include:
- goal
- systems used
- numbered steps
- decisions or exceptions
- screenshots/timeline moments to review
- questions that still need a human answer
```
start with one repeated workflow such as invoice review, CRM update, client onboarding, QA review, or weekly reporting.
## basics & compatibility
screenpipe is source-available and auditable on GitHub at [github.com/screenpipe/screenpipe](https://github.com/screenpipe/screenpipe). the core local capture stack can be inspected and self-hosted, while the prebuilt desktop app, cloud features, team features, and some integrations have commercial licensing on top.
you can self-host the CLI, audit the capture and storage code, and run screenpipe fully offline. enterprise customers can request source access for compliance review.
yes, three ways:
1. **CLI**: `npx -y screenpipe@latest record` gives you local recording, search, and API access from the terminal.
2. **local source build**: clone [github.com/screenpipe/screenpipe](https://github.com/screenpipe/screenpipe) and build the desktop app locally for a visual timeline and UI on top of the CLI.
3. **paid desktop app**: download from [screenpi.pe/onboarding](https://screenpi.pe/onboarding) for the current packaged app, support, auto-updates, and paid features.
current plan details can change, so use the [pricing/download page](https://screenpi.pe/onboarding) as the source of truth before purchasing.
yes. screen capture, audio capture, OCR fallback, accessibility text extraction, local transcription, search, and the local API at `localhost:3030` all work without internet.
the parts that need a network:
* cloud transcription (deepgram, screenpipe-cloud)
* cloud AI providers (Claude, ChatGPT, Gemini, OpenAI)
* cloud archive and team sync
* login and license verification
* connected-app proxies (Slack, Notion, HubSpot, etc.)
use Ollama + local whisper if you want a fully offline setup. see [Ollama](/ollama).
yes on both. screenpipe ships a universal macOS build that runs natively on Apple Silicon (M1, M2, M3, M4, including Pro/Max/Ultra) and on Intel Macs.
Apple Silicon machines get better battery life and faster local whisper transcription. Intel Macs work but should prefer smaller whisper models or cloud transcription.
yes. screenpipe supports Windows 11 (recommended) and Windows 10. on first launch, allow Windows Defender to run the installer ("More info" → "Run anyway") and grant screen capture access.
if the timeline or embedded browser is blank, install or repair the **Microsoft Edge WebView2 Runtime** and restart screenpipe. see [troubleshooting](/troubleshooting).
the screenpipe CLI runs on Linux (Ubuntu, Debian, Fedora, Arch). the desktop app has partial Linux support and is best on X11; Wayland support varies by compositor.
on Ubuntu: `sudo apt install tesseract-ocr libxcb1` before running the binary. server / headless installs are supported for capture and the local API.
yes. screenpipe captures every monitor your OS reports to it. you can list monitors with `curl http://localhost:3030/list-monitors` and choose which displays to include in recording settings.
if a newly plugged-in display is not captured, restart screenpipe so it re-enumerates monitors.
screenpipe transcribes most languages supported by whisper (about 100), including English, Spanish, French, German, Mandarin, Japanese, Korean, Portuguese, Russian, Arabic, and Hindi.
set your primary language in **settings → AI models → language** to skip auto-detect (faster and more accurate). for higher accuracy on accented or domain-specific speech, switch to `whisper-large-v3-turbo` or use deepgram / screenpipe-cloud transcription.
the desktop app checks for updates automatically and prompts you when one is available. you can also click **settings → updates → check for updates**.
for the CLI: `npx -y screenpipe@latest record` always pulls the latest published version. enterprise customers receive signed installers via their account manager.
on macOS:
1. quit screenpipe.
2. drag the app to Trash.
3. delete `~/.screenpipe/` to remove all recordings, transcripts, and pipes.
4. optional: revoke screen recording, accessibility, and microphone permissions in System Settings → Privacy & Security.
on Windows: uninstall via Settings → Apps, then delete `%USERPROFILE%\.screenpipe\`.
on Linux: remove the binary and delete `~/.screenpipe/`.
no. some users find an older, discontinued open-source rust project that shared the name. this site, [screenpi.pe](https://screenpi.pe), and the [github.com/screenpipe/screenpipe](https://github.com/screenpipe/screenpipe) repo are the actively developed product: a local-first AI memory app for macOS, Windows, and Linux.
if you installed something else and it does not match the screenshots on this site, you are not running the current screenpipe.
yes. some screenpipe CLI flags default to enabled, but you can disable them using `--flag=false` (with equals) or `--flag false` (with space).
common default-true flags:
* `--use-pii-removal`: disables PII redaction (email, phone, card numbers, etc.)
* `--api-auth`: requires API key for non-localhost requests
* `--use-all-monitors`: captures every connected display
* `--use-system-default-audio`: captures system audio automatically
examples:
```bash theme={null}
# disable PII removal
npx -y screenpipe@latest record --use-pii-removal=false
# disable API authentication (allow any request)
npx -y screenpipe@latest record --api-auth=false
# space-separated syntax also works
npx -y screenpipe@latest record --use-pii-removal false --api-auth false
```
without the flag, the default is always enabled. a bare flag like `--use-pii-removal` still means "enable."
## billing, license, and account
yes. screenpipe has two common trial paths:
1. **CLI**: `npx -y screenpipe@latest record` gives you local recording, search, and API access from the terminal.
2. **desktop app**: download from [screenpi.pe/onboarding](https://screenpi.pe/onboarding) for timeline, pipes, settings, chat, and connections.
current plan details can change, so use the [pricing/download page](https://screenpi.pe/onboarding) as the source of truth before purchasing.
open the account or billing area from the desktop app or the screenpipe website using the same email you used to buy.
if you cannot find the receipt:
* check the inbox for the purchase email and payment confirmation
* confirm you are signed in with the same email used at checkout
* include your purchase email when contacting support so the license can be found quickly
this usually means the desktop app is signed into a different account than the one that bought the license, or the local account state is stale.
try this:
1. sign out in screenpipe.
2. restart the app.
3. sign back in with the exact purchase email.
4. wait a minute, then reopen the billing or account screen.
if it still shows the wrong plan, contact support with the purchase email, current signed-in email, and a screenshot of the account page.
screenpipe billing and provider rate limits are separate. A plan or credit balance does not guarantee that the selected AI provider will accept every request immediately. The provider may be temporarily throttling requests, or the provider account configured in the IDE may be different from the account shown on the screenpipe billing page.
wait for the retry interval shown by the error, then retry. If the error persists, check which provider and account the IDE is using, or switch to another configured model/provider. Do not start a second screenpipe subscription to fix a provider-side rate limit.
no. AI provider access and screenpipe licensing are separate.
* screenpipe license or subscription: unlocks screenpipe app features, depending on your plan
* Claude/ChatGPT/OpenAI/Anthropic/Ollama: powers AI responses when you choose that model path
* cloud archive or cloud transcription: optional services for storage or processing
if a pipe fails with an AI error, check the AI provider settings. if the app says you are free after purchase, check the screenpipe account.
discounts and refunds depend on the current offer and account state. use the current pricing page as the source of truth, and contact support from the purchase email if a code expired or the wrong plan was applied.
include:
* purchase email
* order date
* plan shown in the app
* the promo or student-discount context, if any
## install, login, and timeline
if you installed only the CLI, recording and the API can work without the desktop timeline. for the visual timeline, install the desktop app from [screenpi.pe/onboarding](https://screenpi.pe/onboarding).
if you already have the desktop app:
1. check `curl http://localhost:3030/health`.
2. wait 1-2 minutes after startup.
3. confirm screen recording and accessibility permissions are enabled.
4. open the desktop app timeline or search page.
5. run `curl "http://localhost:3030/search?limit=5&content_type=all"` to verify data exists.
try:
1. quit screenpipe completely.
2. reopen the app and sign in again.
3. make sure the default browser can open the login callback.
4. disable VPN/proxy temporarily if the callback never returns.
5. confirm the clock on the machine is correct.
if support asks for logs, include your OS, screenpipe version, signed-in email, and whether the app works on another network.
run:
```bash theme={null}
curl http://localhost:3030/health
curl "http://localhost:3030/search?limit=5&content_type=all"
```
if health is OK but search is empty:
* wait 1-2 minutes after startup
* confirm screen recording permission
* confirm accessibility permission, especially on macOS and Windows
* make sure your included/ignored windows filters are not excluding everything
* try a broad search before filtering by app, window, speaker, or time range
screenpipe primarily uses operating-system accessibility APIs to extract structured screen text when the platform and app expose it. OCR is a fallback for pixels or apps that do not expose enough accessible text.
in the API you may see content types such as:
* `accessibility`: text from the OS accessibility tree
* `ocr`: OCR fallback text
* `audio`: transcript data
* `all`: search across available content types
for most user-facing screen text search, start with `content_type=all` or `content_type=accessibility` before narrowing to OCR-only searches.
the local endpoint is:
```bash theme={null}
curl "http://localhost:3030/search?limit=5"
```
not `/api/search`.
use the `api reference` tab or [API recipes](/api-recipes) for copy-paste examples.
yes. use recording filters to include or ignore windows, apps, or URLs. this is useful for meetings, compliance, privacy, and reducing storage.
for scheduled capture or work-hour behavior, use the app settings when available. for custom behavior, a pipe can check the current time and either run, pause itself, or ignore results outside work hours.
this is macOS Gatekeeper on first launch, not a real corruption.
fix:
1. right-click the screenpipe app in Finder.
2. choose **Open** from the menu.
3. click **Open** again on the warning dialog.
after the first launch, you can open it normally. if Gatekeeper still blocks, run `xattr -dr com.apple.quarantine /Applications/screenpipe.app` in Terminal, then reopen.
the Windows installer registers the app as `screenpipe-app.exe`, not `screenpipe.exe`. some pipes or scripts written for macOS/Linux assume the bare `screenpipe` binary name and fail on Windows.
fix the pipe or script to call `screenpipe-app.exe` (or use the full path the installer logged). if you only need the local API, you do not need to call the binary directly — `curl http://localhost:3030/...` works once the app is running.
major macOS updates often reset the TCC (Transparency, Consent, Control) database, which silently revokes screen recording, accessibility, and microphone permissions for installed apps.
fix:
1. open **System Settings → Privacy & Security**.
2. open each of **Screen Recording**, **Accessibility**, and **Microphone**.
3. confirm screenpipe is listed and toggled **on** in each. if it is listed but unchecked, toggle off and on again.
4. quit and reopen screenpipe.
5. verify: `curl "http://localhost:3030/search?limit=1&content_type=all"` should return recent data within 1-2 minutes.
if screenpipe is not listed at all, drag the app to the panel from `/Applications`.
the desktop app adds itself as a login item the first time you launch it. you can confirm or remove it in **System Settings → General → Login Items** on macOS, or **Task Manager → Startup apps** on Windows.
for the CLI, set up a launchd plist on macOS, a systemd user service on Linux, or a Task Scheduler job on Windows that runs `npx -y screenpipe@latest record` at login.
## pipes and custom automations
most pipe failures are prompt shape, data scope, or provider auth.
check:
* the pipe is enabled
* manual run works
* `curl http://localhost:3030/health` succeeds
* `curl "http://localhost:3030/search?limit=5&content_type=all"` returns data
* the prompt tells the pipe exactly where to write, notify, or save output
* the AI provider is connected and has credits
* the pipe has permissions for the endpoints it calls
see [pipe debugging](/pipe-debugging) for the full checklist.
that usually means the pipe process started, hit an error immediately, and exited before you could read it.
do this:
1. open the pipe logs from the app.
2. run the pipe manually from the pipe page.
3. check whether the pipe has a valid `pipe.md`, schedule, and permissions.
4. confirm the local API works: `curl http://localhost:3030/health`.
5. if a script is involved, run it from PowerShell so the error stays visible.
when asking for help, include the pipe name, OS version, screenpipe version, and the log output.
use precise filters only after a broad search works.
start broad:
```bash theme={null}
curl "http://localhost:3030/search?limit=10&content_type=all"
```
then add one filter at a time:
```bash theme={null}
curl "http://localhost:3030/search?limit=10&content_type=accessibility&window_name=Your%20Window"
```
window names can differ from what you see in the title bar, and some apps expose little accessibility text. if accessibility text is empty, try `content_type=all` so OCR fallback and audio can help.
split the problem:
1. confirm the pipe run starts.
2. confirm search returns the event you expect.
3. confirm the prompt tells the pipe exactly when to notify.
4. confirm the integration is connected and the token is current.
5. test the notification or API call outside the pipe once.
for app connections, prefer screenpipe connection proxies instead of pasting secrets into prompts.
no. screenpipe ships with **screenpipe-cloud** AI credits on every paid plan, so pipes and chat work out of the box.
bring-your-own-key (BYOK) is supported if you prefer your own quota or want to use a specific model. you can configure Anthropic, OpenAI, OpenRouter, Groq, or any OpenAI-compatible endpoint in **settings → AI models**. local models via [Ollama](/ollama) need no key at all.
yes. screenpipe works with any OpenAI-compatible local server, including [Ollama](/ollama), llama.cpp, LM Studio, and vLLM.
configure it in **settings → AI models → custom endpoint**. point to `http://localhost:11434/v1` for Ollama. you can then run chat, pipes, and MCP queries fully offline with models like Llama, Qwen, or Mistral.
this comes from Anthropic, not screenpipe. it means your Anthropic console balance is empty.
fix:
1. open [console.anthropic.com/billing](https://console.anthropic.com/settings/billing).
2. add credits or enable auto-recharge.
3. retry the pipe or chat.
alternative: switch the pipe to **screenpipe-cloud** in **settings → AI models** so it uses included credits instead of your Anthropic key. screenpipe-cloud credits and Anthropic credits are completely separate.
yes. AI credits are tied to your account, not the device. signing into the same screenpipe account on a second machine gives that machine access to the same credit pool and billing plan.
if credits look out of sync, sign out and back in on the device that looks behind. credits update on the next API call, not in real time.
`pi-agent` is the local runtime that executes pipes (the part that runs your `pipe.md` and calls AI providers, screenpipe search, and connections). the desktop app bundles it, but on the CLI or on some upgrades it can end up missing.
fix:
1. update to the latest screenpipe.
2. if it still fails, reinstall the app. on macOS that re-bundles pi-agent into `screenpipe.app/Contents/Resources/`.
3. on the CLI: `npx -y screenpipe@latest pipe install pi-agent`.
if a pipe errors with `Failed to extract accountId`, set `preset: screenpipe-cloud` on the pipe — pi-agent is reading the wrong auth preset for ChatGPT tokens.
app updates can disconnect scheduled pipes, integration tokens, or pi-agent. check in this order:
1. **Pipes → My Pipes** → confirm the pipe is still enabled.
2. open the pipe and run it manually. if it fails, the logs show the actual error.
3. for Telegram, Slack, Notion, or other integrations: reconnect the account in **settings → connections** — tokens can expire silently.
4. confirm the local API is healthy: `curl http://localhost:3030/health`.
5. if the pipe relies on a custom schedule like `every 30m`, re-save the schedule so the new scheduler picks it up.
yes. pipes are `pipe.md` files containing a natural-language prompt plus optional `bash` and `bun` code blocks. you do not write a separate program — the prompt drives the pipe.
see [pipes](/pipes), [pipe permissions](/pipe-permissions), and [pipe debugging](/pipe-debugging). prebuilt pipes live in the [pipe store](/pipe-store).
## audio and meetings
no. screenpipe records locally from your screen, microphone, and selected audio devices. it can capture Zoom, Google Meet, Microsoft Teams, Slack huddles, and other call surfaces without a meeting bot joining.
see [meeting intelligence](/meeting-intelligence).
check:
* microphone permission is granted
* the correct input device is selected
* system audio is selected if you need other speakers
* transcription engine is not overloaded
* `curl "http://localhost:3030/search?content_type=audio&limit=1"` returns audio data
on slower machines, reduce audio chunk duration, select fewer devices, or switch to a faster/cloud transcription engine.
yes, but speaker naming depends on audio quality, calendar context, and cleanup. name a speaker once in the UI, merge duplicates when needed, and connect calendar for better meeting context.
speaker labels are useful for meeting summaries, follow-ups, and relationship memory, but you should review important transcripts before sending them externally.
yes — all of them, without joining as a bot. screenpipe captures your microphone plus system audio locally, so any call surface that plays sound on your machine can be transcribed.
this works for Zoom, Google Meet, Microsoft Teams, Slack huddles, Discord voice/video, WebEx, GoToMeeting, FaceTime, WhatsApp calls, Telegram calls, and any browser-based call. no calendar invite is needed, no other participant sees a bot, and recordings stay local by default.
see [meeting intelligence](/meeting-intelligence) and [meeting transcription](/meeting-transcription).
after a call ends, transcripts are available in three places:
1. **timeline**: scrub to the call's timestamp; the transcript appears alongside the screen.
2. **search**: open chat or run `curl "http://localhost:3030/search?content_type=audio&limit=10"`.
3. **meeting summaries**: if you have a meeting-summary pipe enabled, it writes structured notes to Obsidian, Notion, Apple Notes, or a connected destination.
if you see only short phrases instead of a full transcript, increase the audio chunk duration in **settings → recording** and confirm both your microphone *and* system audio are selected.
open the meetings list in screenpipe, find the meeting you want to ask about, and reference it in the chat box. you can either:
1. **direct mention**: type `@audio` in chat, then describe what you want to know — screenpipe will search your meeting transcript to answer questions like "what was said about pricing?" or "what action items came out of this call?"
2. **search first, then chat**: use the timeline to find the meeting, click on the transcript or screen section to focus the time window, then ask the chat anything about that meeting moment. the AI will read the transcript and screen context from that window.
3. **summarize the meeting**: click the **Summarize** button on the meeting transcript (in the note dock at top or bottom) to generate a summary, action items, and decisions — this uses your default AI or a custom pipe for repeatable formats.
for programmatic access, use the meetings API: `curl "http://localhost:3030/meetings?q=customer+sync&limit=10"` to search by title, attendees, or notes, then query the transcript via the search API with the meeting's time window.
see [meeting intelligence](/meeting-intelligence) and [search screen history](/search-screen-history) for more details.
partially. whisper auto-detects the dominant language per audio chunk, so short multilingual exchanges may be tagged as one language. for accurate code-switching, set the primary language explicitly in **settings → AI models → language**, or use deepgram / screenpipe-cloud which handle mixed-language audio better than local whisper-tiny.
on clear English audio with a decent microphone, `whisper-large-v3-turbo` reaches \~95% word accuracy, and deepgram or screenpipe-cloud are comparable or slightly higher. `whisper-tiny` and `whisper-base` are faster but noticeably less accurate.
accuracy drops on heavy accents, background noise, low input gain, or compressed bluetooth-microphone audio (HFP). pick a better engine, set the language explicitly, and use the built-in MacBook microphone instead of bluetooth for the cleanest result.
yes, via pipes. install or write a pipe that takes the latest meeting and writes its summary, action items, and decisions to the destination you choose.
prebuilt destinations include [Obsidian](/obsidian), Notion, Apple Notes, Google Docs, and any connected app. browse the [pipe store](/pipe-store) for ready-made meeting-export pipes.
partially. screenpipe diarizes (separates) different speakers from the audio, and you can name a speaker once so they are recognized across future meetings.
if you connect a calendar, screenpipe can associate participants from invites with the speaker labels. accuracy depends on audio quality and how much sample voice it has for each person.
review labels before sharing transcripts externally.
## privacy, storage, and enterprise
capture and storage are local by default. data leaves your machine only when you enable something that sends it out, such as:
* a cloud AI provider
* cloud transcription or media analysis
* cloud archive or sync
* a connected-app proxy call
* a support bundle you choose to send
see [privacy data flow](/privacy-data-flow) for exact paths.
local data is stored under `~/.screenpipe/` by default:
* `db.sqlite`: metadata, accessibility text, OCR fallback text, transcripts
* `data/`: screen and audio media
* `pipes/`: installed pipes
if you need long-term storage, use [cloud archive](/cloud-archive) or a carefully configured local backup/sync path. for a NAS, make sure the database and active write path are reliable; slow or flaky network storage can corrupt active databases or make the app feel broken.
start or manage the trial from the [screenpipe pricing and account page](https://screenpi.pe/onboarding), then sign in to the desktop app with the same email used at checkout. After checkout, allow a short time for the plan to appear in **settings → account**; restarting the app and signing in again refreshes the local session.
if the app still shows the free plan, verify that the purchase email and signed-in email match, then use the account page's **Manage** action. For an existing subscription, use **Manage** rather than starting a second checkout. If activation remains pending, contact support with the purchase email and the account-page status.
during checkout, a trialing subscription may not appear as a paid subscription immediately. Wait for the account status to refresh before starting another checkout; the desktop app treats an active `trialing` status as active.
yes. enterprise and team workflows usually focus on:
* managed installs on test devices
* device heartbeat and status
* privacy filters and policy controls
* shared pipe configurations
* centralized archive or storage design
* integration with Microsoft 365, SharePoint, cloud storage, CRM, or internal systems
start with [teams](/teams). for Windows fleets, see [Intune deployment](/intune-deployment).
screenpipe is built as local-first AI memory and workflow automation, not a manager surveillance dashboard. the important default is that the user owns local capture. team and enterprise controls should be configured transparently, with clear policies for what is captured, filtered, shared, or archived.
if you need DLP-style real-time enforcement, review your requirements carefully. if you need employee-owned AI memory, SOP capture, meeting memory, or local workflow intelligence, screenpipe is designed for that model.
no, not by default. capture, OCR, transcription, and storage all run locally in `~/.screenpipe/`.
data only leaves your machine when you explicitly enable one of:
* a cloud AI provider (Claude, ChatGPT, Gemini, etc.) — only the text you query
* cloud transcription (deepgram, screenpipe-cloud) — only audio you record
* cloud archive or team sync — only what you choose to archive
* a connection proxy (Slack, Notion, etc.) — only the API payloads
* a support bundle you upload yourself
see [privacy data flow](/privacy-data-flow) for the exact paths and toggles.
passwords typed into password fields are masked by the OS at the accessibility layer, so most apps and browsers do not expose them to screen readers — or to screenpipe. OCR sees what is on screen, which is usually dots.
on top of that, screenpipe redacts the values you type into form fields — passwords, card numbers, secrets — on-device by default, before data is stored or sent. to be extra safe, also add your password manager (1Password, Bitwarden, etc.), banking site, or any sensitive window to **settings → recording → ignored windows**.
yes — incognito only blocks the browser from saving its own history. it does not hide pixels from screen capture or text from accessibility APIs.
if you want incognito sessions excluded, add the private-window title pattern to **settings → recording → ignored windows**, or pause capture during sensitive browsing from the tray icon.
on personal devices: no. screenpipe is local-first and your employer has no access unless you choose to share.
on company devices with screenpipe deployed by IT: depends on the deployment. team and enterprise plans can sync to a shared archive or surface activity to admins, but only when configured and within the bounds your IT policy allows. read [teams](/teams) and your company policy. screenpipe is designed as employee-owned AI memory, not surveillance — see [privacy data flow](/privacy-data-flow).
screenpipe's architecture is local-first by default: capture and storage stay on the user's device, which removes most of the data-residency surface area. cloud features (transcription, archive, AI providers) are optional and can be disabled for compliance-sensitive deployments.
formal certifications, BAAs, and DPAs are available for enterprise contracts — contact [louis@screenpi.pe](mailto:louis@screenpi.pe) with your compliance requirements. self-hosted, fully air-gapped deployments are supported.
no — only the microphones you select in **settings → recording** are open, and only while screenpipe is running. you can disable all audio devices and run screenpipe in screen-only mode.
the operating system shows the standard microphone indicator (orange dot on macOS, mic icon on Windows) whenever the input is active, so you always know.
the meeting button starts a focused recording session — it tags the audio that follows so it's grouped as a meeting in search, summaries, and the timeline. if you already have your microphone selected in **settings → recording**, capture was already happening; the button mainly adds the meeting tag and triggers the post-call summary pipe.
if you keep audio off by default, the button does turn the selected microphone on for the duration of the meeting and off when you stop it.
delete is supported in-app now. you can:
* **range-delete** from the timeline — select a time range and delete it
* **compact database** (`/data/compact`) to reclaim disk after deleting
* **download my archive** to export your data before removing it
for a full wipe: quit screenpipe and delete `~/.screenpipe/data/` (media) and `~/.screenpipe/db.sqlite` (metadata). screenpipe will rebuild from empty on next start.
retention has modes — **media**, **lean**, and **all** — with a cutoff, and screenpipe automatically cleans up data past that cutoff. data is not kept indefinitely by default.
* **media**: evicts old screen/audio media past the cutoff, keeps text and memories
* **lean**: also strips heavier text (elements, accessibility json, ui events), keeps searchable text and memories
* **all**: keeps everything until the cutoff
to keep storage in check: pick a tighter retention mode in **settings → storage**, lower capture FPS, exclude apps you do not need, run **compact database** to reclaim space, or use [cloud archive](/cloud-archive) to offload older months. enterprise deployments can set retention policies as part of their config.
the desktop app sends anonymous product analytics (page views, feature usage, crash reports) via PostHog by default. it does **not** send screen content, audio, transcripts, or file contents.
you can disable analytics in **settings → privacy → telemetry**. self-hosted enterprise builds ship with telemetry off.
## performance and hardware
practical baseline:
* dual-core CPU, 2GB RAM, and enough disk for local media
* quad-core CPU, 4GB+ RAM, and SSD storage recommended
* around 30GB/month at 1 FPS, depending on settings and retention
reduce FPS, disable unused audio devices, use faster transcription, or exclude noisy windows if the machine feels slow.
try:
* lower capture FPS
* exclude apps/windows you do not need
* select fewer audio devices
* use a faster transcription model
* close the timeline when you are not reviewing video
* archive or delete old media
if the problem started suddenly, restart screenpipe and compare before/after. include OS, hardware, screenpipe version, selected devices, and logs when reporting performance issues.
capture, transcription, and OCR are CPU work, so screenpipe does use battery — more than a chat app, less than a video call when tuned correctly.
for battery-friendly settings:
1. **switch transcription to cloud**: settings → AI models → pick `deepgram` or `screenpipe-cloud` instead of local whisper. local whisper is the single biggest battery drain.
2. **lower capture FPS** to 0.5 or 1 in settings → recording.
3. **select fewer audio devices** — one microphone, not five.
4. **add heavy apps** (video editors, IDE builds, games) to **ignored windows**.
5. **close the timeline view** when you are not actively reviewing video.
6. **disable image PII removal** unless you need it — the local image model uses GPU/Neural Engine continuously.
on Apple Silicon MacBooks with these settings, expect 5-10% extra battery draw vs. a baseline workday. Intel Macs see more, and should strongly prefer cloud transcription.
almost always one of two things:
* **local whisper transcription** is keeping the CPU/Neural Engine hot. switch to cloud transcription in settings → AI models.
* **a pipe is in a tight loop** or the embedded chrome timeline is open. open **Pipes → My Pipes** and disable any pipe you do not need; close the timeline tab.
on Intel Macs, even with these tuned, fans run more than on Apple Silicon. consider cloud-only transcription on Intel.
capture and transcription run in a helper subprocess, not the main desktop app, so the top-level "screenpipe" row in the Battery panel can show low while the helper does most of the CPU work.
to see real energy use, open Activity Monitor and search for `screenpipe` — multiple rows will appear. the ones with non-trivial CPU% are the processes to tune via FPS, transcription engine, and selected audio devices.
yes — that is the baseline at 1 FPS with default settings. screen frames are the largest contributor, then audio, then the SQLite metadata.
to use less disk:
* drop FPS to 0.5
* exclude apps you do not need recorded
* lower audio chunk duration or use mono
* set up auto-cleanup of old media in settings → storage
* use [cloud archive](/cloud-archive) to offload older months
enterprise deployments can configure tighter retention by policy.
on Apple Silicon and recent Windows laptops with the recommended settings (1 FPS, cloud transcription, one audio device, ignored heavy apps), screenpipe runs in the background without noticeable impact on typing, video calls, or browsing.
noticeable slowdown usually means: local whisper-large is selected on an underpowered machine, every monitor is being captured at high FPS, or PII redaction is running on every frame. see [troubleshooting](/troubleshooting) for the tuning matrix.
on macOS, screenpipe uses Metal and the Apple Neural Engine for local whisper and image models — nothing to configure.
on Windows and Linux with NVIDIA GPUs, screenpipe has a CUDA build that offloads whisper to the GPU, which dramatically reduces CPU use during transcription. DirectML and Vulkan backends are also available on Windows. if you do not have a supported GPU, prefer cloud transcription (deepgram or screenpipe-cloud).
## teams, enterprise, and deployment
on the team plan, the admin dashboard shows per-member activity summaries (apps used, meetings attended, focus time) without exposing raw recordings.
for richer reporting, run a weekly digest pipe that aggregates each member's screenpipe data and posts a summary to Slack, Notion, or email. raw screen and audio data stays on the user's device unless they explicitly share. see [teams](/teams).
on Team and Enterprise plans, open **settings → team → invite** in the desktop app, enter the member's email, and they receive an invite to install screenpipe with your team license already attached.
for managed fleets, use Intune, Jamf, or your MDM to deploy the installer with the license token pre-set. see [Intune deployment](/intune-deployment).
yes. screenpipe ships a silent installer for Windows (MSI) and a signed `.pkg` for macOS that work with Intune, Jamf Pro, Kandji, Mosyle, and other MDM tools.
pre-configure the license token, telemetry, cloud transcription, and recording filters via a JSON config file dropped at install time. enterprise customers get a deployment guide and a sample MDM configuration profile — see [Intune deployment](/intune-deployment) or contact [louis@screenpi.pe](mailto:louis@screenpi.pe).
enterprise plans support SAML and OIDC SSO through Microsoft Entra ID, Okta, Google Workspace, and other IdPs. SCIM provisioning is available on request.
contact [louis@screenpi.pe](mailto:louis@screenpi.pe) with your IdP and we will set up your tenant.
yes. enterprise deployments can point team data at your own Azure Blob Storage container (one-click OAuth) or your own Amazon S3 bucket — including any S3-compatible store such as MinIO, Cloudflare R2, or Wasabi via a custom endpoint. devices upload directly to your storage with short-lived signed URLs; screenpipe cloud only sees upload manifests, not the data bodies.
configure it on the web dashboard: **screenpi.pe → account → workspace → storage**, pick the backend, and follow the setup (Azure: connect OAuth and choose a container; S3: paste bucket, region, and access keys — a write-only IAM policy is supported). activation runs a test upload through the exact path devices will use before turning anything on.
## common errors
this means screenpipe authenticated successfully but pi-agent (the pipe runtime) is reading the wrong auth preset for your account type.
fix:
1. open the pipe folder (or pipe settings) and find the front-matter.
2. set `preset: screenpipe-cloud`.
3. save and re-run the pipe.
if the error appears on initial login rather than in a pipe, sign out, restart the app, and sign back in with the same email used at purchase.
this comes from the Anthropic API, not from screenpipe. your Anthropic console balance is empty.
fix: add credits at [console.anthropic.com/billing](https://console.anthropic.com/settings/billing), or switch the pipe / chat to **screenpipe-cloud** in **settings → AI models** to use included credits instead of your own Anthropic key.
same shape as the Anthropic case — your OpenAI account is out of credit. add a payment method at [platform.openai.com/billing](https://platform.openai.com/account/billing), or switch the provider to **screenpipe-cloud**, Anthropic, Ollama, or another configured model.
Gatekeeper on first launch. right-click the app in Finder → **Open** → **Open** again on the warning. if it persists, run `xattr -dr com.apple.quarantine /Applications/screenpipe.app` in Terminal and reopen.
the Windows binary is `screenpipe-app.exe`, not `screenpipe.exe`. update the pipe or script to use the correct name, or call the local API directly with `curl http://localhost:3030/...` instead of shelling out to the binary.
usually a stale token or a blocked OAuth callback.
1. quit screenpipe.
2. clear the local session by deleting `~/.screenpipe/auth.json` if it exists.
3. reopen the app and sign in.
4. make sure your default browser can open the login callback (no popup blocker, no VPN that blocks `localhost` callbacks).
5. confirm your system clock is correct — OAuth fails if the clock is off by more than a few minutes.
the local screenpipe endpoint is `/search` at the root, not `/api/search`. use:
```bash theme={null}
curl "http://localhost:3030/search?limit=5&content_type=all"
```
see [API recipes](/api-recipes) for copy-paste examples.
this means the app is failing to write its settings file (usually a permissions issue on `%USERPROFILE%\.screenpipe\`).
1. close screenpipe completely.
2. open `%USERPROFILE%\.screenpipe\` and confirm your user has full write access.
3. delete `settings.json` in that folder to reset to defaults.
4. relaunch screenpipe and reconfigure settings.
if the loop persists, capture logs via **settings → support → export logs** and share them with [louis@screenpi.pe](mailto:louis@screenpi.pe).
## help
include:
* OS and version
* screenpipe version
* whether you use desktop app, CLI, or both
* output of `curl http://localhost:3030/health`
* the exact page, pipe, or endpoint that failed
* pipe logs, if a pipe is involved
* selected audio device, if audio is involved
* purchase email, if billing is involved
avoid sending secrets. redact API keys, tokens, private customer data, and screenshots you do not want support to see.
# monitor one approved window or website
Source: https://docs.screenpipe.com/focused-monitoring
Create a narrow local screenpipe monitor for one approved app, window, or website with recording filters, explicit no-data states, and reviewed alerts.
focused monitoring is useful for a build console, support queue, dashboard, or other surface you are authorized to observe. do not use it for covert employee monitoring or to capture unrelated windows “just in case.”
```mermaid theme={null}
flowchart TD
A["approved surface and schedule"] --> B["narrow app, window, or URL filter"]
B --> C["local result or explicit no-data state"]
C --> D["reviewed notification or report"]
```
## step by step
Write the exact condition worth reporting, such as a failed build, a new priority ticket, or a dashboard threshold visible in one window. define what is not in scope.
Use [recording filters](/privacy-filter) to exclude unrelated apps, private browser windows, personal messaging, credentials, and other sensitive surfaces.
Search a short window with `app_name`, `window_name`, `browser_url`, and a query term. confirm that it returns the intended surface and excludes a nearby unrelated one.
Require the pipe to distinguish **matching event**, **no matching event**, **no captured data**, and **API or execution error**. these states should not collapse into one silent success.
Under **Pipes → My Pipes → create your own pipe**, describe the exact filter, schedule you may add later, and local artifact. request no external side effects.
Run once with a known matching event and once with no event. inspect the artifact and execution log for both cases.
After stable manual runs, enable a desktop notification or local report. require approval before creating tickets, sending messages, or changing a remote system.
## API test
```bash theme={null}
export SCREENPIPE_API_KEY="$(npx -y screenpipe@latest auth token)"
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" \
"http://localhost:3030/search?q=failed&app_name=Terminal&window_name=build&start_time=30m+ago&end_time=now&limit=20"
```
## pipe-builder prompt
```text theme={null}
Create a manual local monitoring pipe for one approved app, window, or website.
Use bounded authenticated screenpipe API searches and write a Markdown artifact.
Report one of four states: matching event, no matching event, no captured data,
or execution error. Include the source time range and matching UI text.
Do not send messages, create tickets, or change another system.
```
a missing search result does not prove that an event did not happen. it may mean the surface was not captured, the filter was wrong, or the API failed.
# screenpipe for developers: MCP and REST API for AI coding
Source: https://docs.screenpipe.com/for-developers
Give your AI coding assistant memory of your screen via MCP and the screenpipe REST API — works with Claude Code, Cursor, Cline, Continue, and Gemini CLI.
screenpipe gives developers a superpower: AI that knows what you've been working on. it captures your screen and audio 24/7 and makes it available to coding assistants via MCP and REST API.
want copy-paste API calls first? start with [API recipes](/api-recipes). building a recurring workflow? use [pipe debugging](/pipe-debugging).
## what developers use screenpipe for
* **code search across time** — find that code snippet you saw in a PR review last week, even if you closed the tab
* **meeting recall** — search what was said in standups, design reviews, or pair programming sessions
* **context for AI coding** — give Cursor, Claude Code, or Cline memory of what's on your screen right now and what you worked on earlier
* **automated workflows** — pipes that auto-track time in Toggl, sync daily activity to Obsidian, or generate standup reports
## integrations
screenpipe works with any AI tool that supports MCP or HTTP APIs:
| tool | integration | guide |
| --------------- | ---------------------------------------------------------------------------------------------------------- | --------------------------- |
| **Claude Code** | MCP server — Claude Code can search your screen history, find code you saw earlier, recall meeting context | [setup guide](/claude-code) |
| **Cursor** | MCP server — add screenpipe as a context source for Cursor's AI | [setup guide](/mcp-server) |
| **Cline** | MCP server — give Cline access to your full screen history | [setup guide](/cline) |
| **Continue** | MCP server — add screen context to Continue's AI completions | [setup guide](/continue) |
| **Gemini CLI** | MCP server — use screenpipe with Google's Gemini CLI | [setup guide](/gemini-cli) |
| **OpenCode** | MCP server — search screen history from OpenCode | [setup guide](/opencode) |
| **Ollama** | local AI — use any local model with screenpipe, 100% private | [setup guide](/ollama) |
## quick start
1. [download screenpipe](https://screenpi.pe/onboarding)
2. add the MCP server to your coding tool:
```json theme={null}
{
"mcpServers": {
"screenpipe": {
"command": "npx",
"args": ["-y", "screenpipe-mcp"]
}
}
}
```
3. ask your AI assistant: "what was I working on in the last hour?" or "find the code snippet I saw in that PR review"
## local API in one minute
```bash theme={null}
curl http://localhost:3030/health
curl "http://localhost:3030/search?q=error&content_type=all&limit=10"
curl "http://localhost:3030/activity-summary?start_time=2h+ago&end_time=now"
```
if API auth is enabled, add `-H "Authorization: Bearer $SCREENPIPE_API_KEY"`. see [API recipes](/api-recipes) for meetings, speakers, frames, memories, retention, archive, and delete-range examples.
## example prompts
once screenpipe is connected to your coding assistant:
* "find the error message I saw in the terminal 30 minutes ago"
* "what did we discuss in the standup about the auth refactor?"
* "show me the API endpoint I was looking at in the browser"
* "summarize what I worked on today for my standup"
## automate with pipes
[pipes](/pipes) are scheduled AI agents that run on your screen data. developers use them for:
* **time tracking** — auto-log coding time to Toggl based on active apps
* **daily journals** — sync screen activity to Obsidian
* **standup reports** — generate daily summaries of what you worked on
## get screenpipe
screenpipe includes everything developers need — MCP server, pipes, cloud AI, and more.
[download screenpipe →](https://screenpi.pe/onboarding)
# gemini CLI - google's AI with screen context
Source: https://docs.screenpipe.com/gemini-cli
Connect screenpipe to Gemini CLI via MCP so Google's terminal AI assistant can reference your screen history and meeting transcriptions while you code.
[Gemini CLI](https://github.com/google/gemini-cli) is Google's terminal-based AI coding assistant. it supports MCP servers, so you can connect screenpipe to give Gemini context about what you've been working on.
## setup
Gemini CLI uses MCP for external tools. add screenpipe to your settings file (`~/.gemini/settings.json`):
```json theme={null}
{
"mcpServers": {
"screenpipe": {
"command": "npx",
"args": ["-y", "screenpipe-mcp"]
}
}
}
```
restart Gemini CLI after configuration.
## usage
once configured, Gemini can search your screen history:
```bash theme={null}
gemini
> what was I working on this morning?
> find the error message I saw in my terminal earlier
> summarize the documentation I was reading about kubernetes
```
## available tools
screenpipe provides these MCP tools to Gemini:
| tool | description |
| ------------------ | --------------------------------------------------------------------------------------- |
| `search-content` | search screen text (accessibility-first, OCR fallback), audio transcriptions, and input |
| `activity-summary` | lightweight overview of app usage, speakers, and recent texts for a time range |
| `search-elements` | search structured UI elements from the accessibility tree |
| `frame-context` | full accessibility tree, URLs, and text for a specific frame |
| `list-meetings` | list detected meetings with duration, app, and attendees |
| `export-video` | export screen recordings as MP4 for a time range |
## example workflows
**context-aware coding:**
```
> I was looking at a react component earlier that handled
> form validation, find it and help me implement something similar
```
**debug from memory:**
```
> there was an error in my build output, find it and help me fix it
```
**recall documentation:**
```
> what did that API documentation say about rate limits?
```
## requirements
* screenpipe running on localhost:3030
* Gemini CLI installed
* Node.js >= 18.0.0
## troubleshooting
**MCP server not connecting?**
1. **verify screenpipe is running:**
```bash theme={null}
curl http://localhost:3030/health
```
you should see `{"status":"healthy"}`. if this fails, start screenpipe first.
2. **check the settings file path:**
the config should be in `~/.gemini/settings.json`. verify the file exists and contains valid JSON:
```bash theme={null}
cat ~/.gemini/settings.json | jq .
```
3. **restart Gemini CLI:**
after adding or modifying the config, fully restart Gemini CLI. if it was running in a terminal, exit and reopen it.
**queries returning empty?**
* make sure screenpipe has recorded data: `curl "http://localhost:3030/search?limit=1"`
* if empty, let screenpipe run for a minute and try again
* check screen recording is enabled (macOS: System Settings > Privacy & Security > Screen Recording)
need help? [join our discord](https://discord.gg/screenpipe).
# install screenpipe on macOS, Windows, and Linux
Source: https://docs.screenpipe.com/getting-started
Install screenpipe on macOS, Windows, or Linux. Record everything on screen and search screen history on Mac, Windows, and Linux. Start recording in minutes.
want the fastest path? see the [5-minute quickstart →](/quickstart)
## desktop app or CLI?
| choose | if you want |
| ----------- | --------------------------------------------------------------------------- |
| desktop app | visual timeline, pipes, connections, chat, settings, and guided permissions |
| CLI | free local recording, REST API access, and terminal-first workflows |
## desktop app (recommended)
download the [desktop app](https://screenpi.pe/onboarding) and follow the installation instructions. works on macOS, Windows, and Linux.
the app manages recording, settings, search, pipes, and AI connections — no terminal needed.
## CLI
```bash theme={null}
npx -y screenpipe@latest record
```
this starts the screenpipe daemon in the background and continuously records your screen. data is stored in `~/.screenpipe/` on your local machine.
### troubleshooting: "npx -y screenpipe\@latest record" not working
if the command fails, try these fixes in order:
**unsupported platform:**
```bash theme={null}
node -p "process.platform + '-' + process.arch"
```
if the output is not `darwin-arm64`, `darwin-x64`, `linux-x64`, or `win32-x64`, your platform is not supported.
**missing platform package (macOS/Windows/Linux):**
```bash theme={null}
npx -y screenpipe@latest --version
```
the CLI needs the platform-specific binary. re-running with `npx -y screenpipe@latest` pulls a fresh copy.
**macOS: binary blocked by Gatekeeper:**
if you see "app is damaged" or "permission denied", run:
```bash theme={null}
xattr -d com.apple.quarantine ~/.npm/_npx/*/node_modules/screenpipe*/bin/screenpipe
```
or use the desktop app instead — it handles permissions automatically.
**Linux: missing system libraries:**
```bash theme={null}
sudo apt install libasound2-dev ffmpeg # ubuntu/debian
sudo dnf install alsa-lib ffmpeg # fedora
```
**Windows: .NET runtime missing:**
the screenpipe installer includes .NET, but if you're using the CLI only, install [.NET 8.0](https://dotnet.microsoft.com/en-us/download/dotnet/8.0).
**port 3030 already in use:**
if screenpipe is already running, the CLI will fail to bind. check for existing processes:
```bash theme={null}
lsof -i :3030 # macOS/Linux
netstat -ano | findstr :3030 # Windows
```
still stuck? [ask in Discord](https://discord.gg/screenpipe).
### suppress CLI reminders (optional)
when running `npx -y screenpipe@latest record`, the CLI prints a friendly reminder every 5 minutes to download the desktop app. if you prefer to run the CLI silently, disable the reminders:
```bash theme={null}
SCREENPIPE_NO_REMINDERS=1 npx -y screenpipe@latest record
```
or set it once in your shell:
```bash theme={null}
export SCREENPIPE_NO_REMINDERS=1
npx -y screenpipe@latest record
```
### access your recorded timeline
after starting the CLI, you have three ways to access your screen history:
1. **Desktop app (easiest)** — download the [screenpipe app](https://screenpi.pe/onboarding) for a visual timeline and built-in search
2. **REST API** — query recorded content directly via curl or code (see below)
3. **AI assistants** — connect Claude, Cursor, or other tools via MCP
## verify it's running
once screenpipe starts, it serves an API on `localhost:3030`:
```bash theme={null}
# check health
curl http://localhost:3030/health
# search your screen history
curl "http://localhost:3030/search"
```
if you've enabled API auth in settings, add `-H "Authorization: Bearer "` to these requests. by default the local API needs no auth.
## check and update your version
to ensure you're running the latest version:
```bash theme={null}
# check your current version
npx -y screenpipe@latest --version
```
to update to the latest version, just run with `@latest` — it always pulls the newest release:
```bash theme={null}
npx -y screenpipe@latest record
```
the latest version is always available at npm. if you're on an older version, you'll see a warning when you run `npx -y screenpipe@latest record`.
### API authentication (if enabled)
by default the local API on `localhost:3030` needs no auth. if you've turned on API auth in settings, get your key by running:
```bash theme={null}
npx -y screenpipe@latest auth token
```
then use it in curl:
```bash theme={null}
curl "http://localhost:3030/search?q=example" \
-H "Authorization: Bearer "
```
or set it as an environment variable:
```bash theme={null}
export SCREENPIPE_API_KEY=$(npx -y screenpipe@latest auth token)
curl "http://localhost:3030/search?q=example" \
-H "Authorization: Bearer $SCREENPIPE_API_KEY"
```
## connect to AI
screenpipe works with any AI that supports MCP or HTTP APIs.
the fastest path is one command — it installs the screenpipe skills and registers the MCP server for your agent:
```bash theme={null}
npx -y screenpipe@latest agent setup
```
where `` is one of `openclaw`, `hermes`, `claude-code`, `claude-desktop`, `codex`, `cursor`, or `windsurf`. add `--api-url ` if screenpipe runs on another machine.
prefer to wire it up manually? here's where each tool plugs in:
| integration | how |
| ------------------ | ---------------------------------------------------------- |
| **claude desktop** | add screenpipe as MCP server ([guide](/mcp-server)) |
| **cursor** | add screenpipe MCP to your project ([guide](/mcp-server)) |
| **claude code** | use screenpipe MCP or curl the API ([guide](/claude-code)) |
| **ollama** | configure in app settings, use any local model |
## what's next?
see all available automations — day recap, standup, time tracking, and more
add screenpipe to Claude, Cursor, ChatGPT, or any AI tool
link Calendar, Google Docs, Notion, Obsidian for richer context
explore use cases — loop closing, meeting notes, time tracking, and more
copy-paste local API workflows for search, meetings, speakers, frames, and retention
* [search your screen history](/search-screen-history) — find anything you've seen
* [API reference](/cli-reference) — REST API endpoints and parameters
* [troubleshooting](/troubleshooting) — fix common issues
* [join our discord](https://discord.gg/screenpipe) — get help from the community
[download screenpipe →](https://screenpi.pe/onboarding)
# screenpipe: local-first 24/7 screen and audio memory for AI
Source: https://docs.screenpipe.com/home
screenpipe captures your screen 24/7, reads app text through accessibility APIs, transcribes audio locally, and feeds it to AI assistants.
screenpipe records your screen and audio 24/7, runs locally, and makes everything available to AI. search anything you've seen, automate workflows with pipes, and give AI assistants memory of your screen.
## what screenpipe does
* **captures everything** — screen text via accessibility APIs with OCR fallback, audio transcription, app names, browser URLs, user input
* **runs locally** — all data stays on your machine in `~/.screenpipe/`
* **AI-powered search** — find anything you've seen or heard via natural language or API
* **pipes** — scheduled AI agents that summarize your day, track time, sync to Obsidian, and more ([browse pipes](/pipe-store)) — click **Pipes** in the sidebar to install
* **MCP server** — give Claude, Cursor, ChatGPT, and other AI tools memory of your screen ([setup](/mcp-server))
* **connect your apps** — dozens of integrations: Slack, Notion, Google Calendar, Obsidian, Toggl, HubSpot, Salesforce, Zoom, PostHog, Sentry, and more ([connections](/connections)) — configure in **settings → connections**
## get started in 5 minutes
install → connect AI → run your first pipe in under 5 minutes
daily summaries, time tracking, meeting notes, loop closing, and more
see every automation available — day recap, standup, time breakdown, and more
add screenpipe to Claude, Cursor, ChatGPT, or any MCP-compatible tool
let your agent watch your activity and remember your workflows in the background
copy-paste search, meetings, speakers, frames, and retention workflows
see what stays local and when data can leave your machine
## popular use cases
| I want to... | how |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------ |
| **find something I saw on screen** | search in the app, ask your AI, or `curl localhost:3030/search?q=...` |
| **get a summary of my day** | run the [Day Recap pipe](/pipe-store) |
| **auto-track my time** | install [Toggl Time Tracker](/pipe-store) or run Time Breakdown |
| **transcribe meetings** | automatic — use [meeting intelligence](/meeting-intelligence), search audio, or install a meeting pipe |
| **give Claude memory of my screen** | [connect via MCP](/mcp-server) — one click in settings |
| **sync activity to Obsidian** | [connect Obsidian](/obsidian) and enable the sync pipe |
| **close my loops** | ask your AI "what was I working on before lunch?" — [learn more](/use-cases) |
run the CLI with `npx -y screenpipe@latest ` (and the MCP server with `npx -y screenpipe-mcp`). the local API on `localhost:3030` needs no auth by default — if you've enabled API auth in settings, add `-H "Authorization: Bearer "` to any curl.
## community
need help? have ideas? [join our discord](https://discord.gg/screenpipe) — 10k+ members building with screenpipe.
[download screenpipe →](https://screenpi.pe/onboarding)
# reconstruct a support or engineering incident
Source: https://docs.screenpipe.com/incident-reconstruction
Build a bounded incident timeline from screens, logs, calls, and messages while separating observed facts, inference, and unknowns.
screenpipe can help recover the sequence around a customer issue, failed deployment, local error, or debugging session. it is supporting evidence, not a replacement for production logs, database state, billing records, or the affected customer's account.
```mermaid theme={null}
flowchart TD
A["incident boundary"] --> B["screen, transcript, and message events"]
B --> C["fact / inference / unknown timeline"]
C --> D["production-source verification"]
D --> E["reviewed incident note"]
```
## step by step
If the incident is active, follow the operating runbook and contain harm before writing the narrative. do not let retrospective automation delay recovery.
Record the earliest known symptom, latest known good state, affected system or customer, and the timezone. search a slightly wider window to capture precursor events.
Search exact errors, app names, terminal windows, ticket IDs, deployment identifiers, and meeting terms. preserve the original source app and time for each event.
Put directly observed events in **facts**, interpretation in **inferences**, and missing or conflicting state in **unknowns**. correlation is not a proven cause.
Check service logs, release artifacts, Sentry, billing, CRM, database, or account state as appropriate. state clearly when screenpipe history is the only available source.
Replace tokens, customer payloads, private messages, and personal data with narrow summaries or secure artifact references.
Include impact, timeline, confirmed cause if known, recovery, unresolved risk, owners, and follow-up dates. do not claim resolution without a current system read-back.
## timeline prompt
```markdown theme={null}
Reconstruct an incident timeline from this bounded screenpipe data.
Use a table with:
- timestamp and timezone
- observed event
- source app, window, meeting, or message
- evidence state: fact, inference, or unknown
- relevance to impact, cause, or recovery
Then summarize impact, confirmed cause if any, recovery actions, open risks,
and the production sources that still need verification.
Do not convert correlation into causation.
Do not expose secrets or raw customer data.
```
## useful search pattern
```bash theme={null}
export SCREENPIPE_API_KEY="$(npx -y screenpipe@latest auth token)"
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" \
"http://localhost:3030/search?q=exact-error-or-ticket-id&start_time=3h+ago&end_time=now&limit=100"
```
screenpipe may show what an operator saw or typed. it does not by itself prove what a remote service, account, or database did.
# deploy screenpipe via Microsoft Intune
Source: https://docs.screenpipe.com/intune-deployment
Fleet-deploy screenpipe enterprise to Windows devices via Microsoft Intune by assigning a Microsoft Entra group for automatic installation.
deploy screenpipe enterprise to every Windows machine in a Microsoft Entra (Azure AD) security group via Intune. no per-laptop install, no IT touching individual devices. end-to-end takes \~10 minutes once you have the enterprise license.
this guide is for IT admins on **screenpipe enterprise**. consumer / team plans don't ship the .intunewin package. if you don't have a license yet, email [louis@screenpi.pe](mailto:louis@screenpi.pe).
## prerequisites
* screenpipe enterprise license (your admin email is on the license's `admin_emails`)
* Microsoft Intune subscription (included in Microsoft 365 E3/E5, EMS E3/E5, or Intune standalone)
* a Microsoft Entra security group containing the users that should receive screenpipe
* access to the [Intune admin center](https://intune.microsoft.com)
## step 1 — download the .intunewin
sign in to [screenpi.pe/enterprise](https://screenpi.pe/enterprise) with the admin email on your license, open the **builds** tab, and download the latest **windows x64** `intunewin` file.
the `.intunewin` is a Microsoft Win32 Content Prep wrapper around a code-signed NSIS installer (`screenpipe__x64-setup.exe`). screenpipe builds this for every enterprise release.
## step 2 — create the Win32 app in Intune
in the [Intune admin center](https://intune.microsoft.com):
**Apps → Windows → Add**. for app type pick **Windows app (Win32)**.
**App package file** → upload the `.intunewin` from step 1. Intune reads the installer metadata automatically.
name, publisher, description as you'd like them to appear to end users in the Company Portal. logo: download from [screenpi.pe/icon.png](https://screenpi.pe/icon.png).
## step 3 — program (install & uninstall commands)
```bash install command theme={null}
powershell.exe -ExecutionPolicy Bypass -File install-screenpipe-enterprise.ps1
```
```bash uninstall command theme={null}
"%ProgramFiles%\screenpipe\uninstall.exe" /S
```
the `.intunewin` contains the signed NSIS installer plus `install-screenpipe-enterprise.ps1`. the wrapper runs the installer silently and writes `HKLM\SOFTWARE\screenpipe\InstallSource=Intune`, `UpdateManager=mdm`, and `Version=` so the app and enterprise dashboard can report that updates are Intune-managed.
| field | value |
| ----------------------- | ----------------------------------------------------------------------------------------------------------- |
| install behavior | **System** (machine-wide install — screenpipe enterprise is built `perMachine`) |
| device restart behavior | **No specific action** (no reboot required) |
| return codes | leave Intune's defaults (`0` success, `1707` success, `3010` soft reboot, `1641` hard reboot, `1618` retry) |
## step 4 — requirements
| field | value |
| ----------------------------- | --------------- |
| operating system architecture | x64 |
| minimum operating system | Windows 10 1809 |
## step 5 — detection rules
pick **Manually configure detection rules**. for first-time installs, a file-exists rule is enough:
| field | value |
| ---------------------------------------------- | --------------------------- |
| rule type | File |
| path | `%ProgramFiles%\screenpipe` |
| file or folder | `screenpipe-app.exe` |
| detection method | File or folder exists |
| associated with a 32-bit app on 64-bit clients | No |
Intune uses this to decide whether the install succeeded and whether the app is already present on subsequent check-ins.
for versioned upgrades, prefer a registry detection rule:
| field | value |
| ---------------------------------------------- | ----------------------------------------------- |
| rule type | Registry |
| key path | `HKEY_LOCAL_MACHINE\SOFTWARE\screenpipe` |
| value name | `Version` |
| detection method | String comparison |
| operator | Equals |
| value | the version you uploaded, for example `2.4.208` |
| associated with a 32-bit app on 64-bit clients | No |
without version-aware detection, Intune can tell that screenpipe exists but cannot tell whether a device is still on an older release.
## step 6 — dependencies & supersedence
screenpipe ships everything it needs (WebView2, ONNX Runtime, ffmpeg) bundled inside the NSIS installer. **leave dependencies empty.**
if you're updating from an older deployed version, set **supersedence** to the previous Intune app entry so Intune uninstalls the old version cleanly.
## step 7 — automatic updates
screenpipe enterprise supports two update managers:
* **Intune/MDM-managed**: the recommended default for centrally managed fleets. upload each new `.intunewin`, use the registry `Version` detection rule above, and supersede the previous app entry.
* **Screenpipe-managed automatic updates**: the app can self-update from signed enterprise releases when enabled in the enterprise dashboard.
in the enterprise dashboard, leave app updates on **auto-detect** unless you explicitly want the app to self-update. devices installed through this Intune package stamp `UpdateManager=mdm`, so auto-detect keeps in-app updates disabled and lets Intune remain the source of truth.
## step 8 — assignments
assign as **Required** to the Microsoft Entra security group containing your screenpipe users (e.g. `screenpipe-users`). Intune will install screenpipe on every device a group member signs into — typically within \~1 hour of next Intune check-in, or immediately if the user clicks **Sync** in Company Portal.
also assign **Uninstall** to a "screenpipe-revoke" group if you want a kill switch — moving a user there triggers an automatic uninstall at next check-in.
## step 9 — activate the enterprise license
screenpipe needs the license key to enable enterprise mode (centralized telemetry, policy enforcement, dashboard access).
after Intune installs screenpipe, users open **Settings → Enterprise**, paste the license key, and sign in. the key is stored in the Tauri secure store on their device.
add a **PowerShell script** to your Intune device-configuration profile, assigned to the same group, that writes the key before screenpipe first launches:
```powershell theme={null}
$key = "ENT-XXXX-XXXX-XXXX-XXXX" # your license key
New-Item -Path "HKLM:\SOFTWARE\screenpipe" -Force | Out-Null
Set-ItemProperty -Path "HKLM:\SOFTWARE\screenpipe" -Name "EnterpriseLicenseKey" -Value $key -Type String
```
screenpipe reads `HKLM\SOFTWARE\screenpipe\EnterpriseLicenseKey` on first launch and self-activates without user interaction.
## verifying the deployment
* in the Intune admin center: **Apps → screenpipe → Device install status** shows per-device install state
* on the device: `C:\Program Files\screenpipe\screenpipe-app.exe` exists, screenpipe icon appears in the system tray after first user sign-in
* in the [enterprise dashboard](https://screenpi.pe/enterprise) → **devices** tab: each installed device starts heartbeating within minutes of launch, scoped to your license
## troubleshooting
NSIS perMachine installs to `%ProgramFiles%\screenpipe` but doesn't add a Start Menu autostart by default. users either launch from Start Menu, or you can enable autostart via the enterprise policy: in the [enterprise dashboard](https://screenpi.pe/enterprise) → **policy** → toggle `autostart_on_login: true`.
almost always insufficient privileges — confirm install behavior is **System**, not **User**. user-context installs can't write to `%ProgramFiles%`.
either the registry pre-stage didn't run before first launch (check Intune script assignment / order) or the license key has expired. check expiry in the [enterprise dashboard](https://screenpi.pe/enterprise) → **policy** → license info.
on Windows, microphone access is permission-gated. either deploy a Windows privacy-settings profile that grants screenpipe microphone access, or have users approve once at first launch. policy-based grant is cleaner for fleet deployments — contact us if you need the AppX-style manifest mapping.
## also see
* macOS Jamf / Kandji / Mosyle deployment: contact us — `.pkg` distribution flow is identical in shape to the above but with macOS MDM tooling
* enterprise dashboard reference: [screenpi.pe/enterprise](https://screenpi.pe/enterprise) (members, devices, pipes, policy, builds)
* questions or stuck: [louis@screenpi.pe](mailto:louis@screenpi.pe)
# MCP server setup for Codex, Claude, Cursor, and AI tools
Source: https://docs.screenpipe.com/mcp-server
Set up screenpipe as a Model Context Protocol server so Codex, Claude, and Cursor can search your screen history and audio transcripts.
screenpipe provides an MCP (Model Context Protocol) server that lets AI assistants like Codex, Claude, and Cursor search your screen recordings, audio transcriptions, and control your computer.
## choose your MCP setup
| client | best path | restart needed | notes |
| ------------------------------------- | ----------------------------------------------------------------------------------- | -------------------------- | --------------------------------------------- |
| Claude Desktop | one-click install from settings -> connections | yes | restart Claude completely after install |
| Claude Code | `claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mcp` | new session | use `/mcp` to verify |
| Codex | one-click connect from settings -> connections | new session | writes `~/.codex/config.toml` |
| Cursor | deep link or global MCP config | usually yes | project configs can override global configs |
| Warp | paste per-server JSON in MCP settings | no, but reconnect if stale | Warp does not use the Claude JSON wrapper |
| Msty | HTTP MCP server | no | useful when the client expects HTTP transport |
| Cline, Continue, Gemini CLI, OpenCode | stdio MCP | depends on client | use `npx -y screenpipe-mcp` |
the MCP server talks to the local screenpipe API. if MCP works but returns empty results, first check `curl http://localhost:3030/health` and `curl "http://localhost:3030/search?limit=1"`.
## claude desktop
### quick setup (recommended)
open the **screenpipe app** → **settings** → **connections** → click **"install extension"**
Claude will open and prompt you to confirm. click **install** — done!
try asking Claude: *"what did I do in the last 5 minutes?"*
make sure screenpipe is running when you use Claude with screenpipe features.
### manual setup (stdio)
if the one-click install doesn't appear or you prefer manual config, edit Claude's config file directly:
**macOS:** `~/Library/Application\ Support/Claude/claude_desktop_config.json`
**Windows:** `%AppData%\Claude\claude_desktop_config.json`
add or update the `mcpServers` section:
```json theme={null}
{
"mcpServers": {
"screenpipe": {
"command": "npx",
"args": ["-y", "screenpipe-mcp"],
"transport": "stdio"
}
}
}
```
save, then **restart Claude Desktop completely** (force-quit from Activity Monitor / Task Manager, then reopen). verify the connection works by asking Claude: *"what's on my screen right now?"*
## claude code
one command:
```bash theme={null}
claude mcp add screenpipe --transport stdio -- npx -y screenpipe-mcp
```
to make it available across all your projects:
```bash theme={null}
claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mcp
```
verify with `claude mcp list` or `/mcp` inside Claude Code.
## codex
### quick setup (recommended)
open the **screenpipe app** → **settings** → **connections** → click **connect** next to Codex.
screenpipe writes the MCP server to `~/.codex/config.toml`. open a new Codex session, then try: *"what did I do in the last 5 minutes?"*
make sure screenpipe is running when you use Codex with screenpipe features.
### manual setup (stdio)
if the one-click install doesn't appear or you prefer manual config, edit `~/.codex/config.toml` and add:
```toml theme={null}
[mcp_servers.screenpipe]
command = "npx"
args = ["-y", "screenpipe-mcp"]
enabled = true
```
save, then open a new Codex session. if you use a local screenpipe API key, set it in the same block:
```toml theme={null}
[mcp_servers.screenpipe.env]
SCREENPIPE_LOCAL_API_KEY = "your-local-api-key"
```
## cursor
[click here to install in cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=screenpipe\&config=eyJ0eXBlIjoic3RkaW8iLCJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsInNjcmVlbnBpcGUtbWNwIl19)
or manually: open **cursor settings** → **mcp** → **add new global mcp server** → set command to `npx` with args `["-y", "screenpipe-mcp"]`.
## warp
Warp's Agent Mode supports MCP. Open **Settings** → **AI** → **Manage MCP servers** → **+ Add**, choose **CLI Server (Command)**, then paste:
```json theme={null}
{
"screenpipe": {
"command": "npx",
"args": ["-y", "screenpipe-mcp"],
"start_on_launch": true
}
}
```
Save — the server should show **Running**. Then ask Warp's agent: *"what did I do in the last 5 minutes?"*
Warp's MCP schema is per-server (no wrapping `mcpServers` object). Don't paste the Claude/Cursor JSON shape — it won't validate.
You can also reach this screen via the Command Palette → *Open MCP Servers*. Or just open the screenpipe app → **settings** → **connections** → **Warp** to copy the config.
## other editors (cline, continue, windsurf, etc.)
any editor that supports MCP works with screenpipe. the server command is:
```bash theme={null}
npx -y screenpipe-mcp
```
add this as a stdio MCP server in your editor's MCP settings. see also:
* [continue setup](/continue)
* [cline setup](/cline)
## HTTP transport (optional)
if you need remote MCP access or prefer HTTP over stdio, the `screenpipe-mcp` npm package includes an HTTP server binary. both the stdio (`screenpipe-mcp`) and HTTP (`screenpipe-mcp-http`) commands come from the same npm package.
### localhost only (default)
```bash theme={null}
npx -y screenpipe-mcp-http --port 3031
```
this starts an HTTP MCP server on `http://127.0.0.1:3031`. useful for tools like [Msty](https://msty.studio) that support HTTP MCP transport.
### expose to your LAN
to access the server from other machines on your network, use `--listen-on-lan`. **this requires an API key for security:**
```bash theme={null}
npx -y screenpipe-mcp-http --port 3031 --listen-on-lan --api-key your-secret-key
```
then from a remote machine, call the server with the bearer token:
```bash theme={null}
curl -H "Authorization: Bearer your-secret-key" \
http://:3031/mcp/search?q=example
```
HTTP MCP can expose screen history. when using `--listen-on-lan`, always set an `--api-key` — screenpipe will refuse to start without it. keep the key secret and only share with trusted services.
## available tools
### search-content (all platforms)
search through recorded screen content, audio transcriptions, and user input events:
| parameter | type | description |
| ---------------- | ------- | ------------------------------------------------------------------- |
| `q` | string | search query (optional - omit to get recent content) |
| `content_type` | string | `all`, `ocr`, `audio`, `input`, or `accessibility` (default: `all`) |
| `limit` | integer | max results (default: 10) |
| `offset` | integer | pagination offset (default: 0) |
| `start_time` | string | ISO 8601 UTC start time (e.g., `2024-01-15T10:00:00Z`) |
| `end_time` | string | ISO 8601 UTC end time |
| `app_name` | string | filter by app (e.g., `Google Chrome`, `Slack`) |
| `window_name` | string | filter by window title |
| `min_length` | integer | minimum content length |
| `max_length` | integer | maximum content length |
| `include_frames` | boolean | include base64 screenshots for screen-text results |
| `speaker_ids` | string | comma-separated speaker IDs for audio filtering (e.g., `1,2,3`) |
| `speaker_name` | string | filter audio by speaker name (case-insensitive partial match) |
### export-video
create video exports from screen recordings for a specific time range:
| parameter | type | description |
| ------------ | ------ | ---------------------------------- |
| `start_time` | string | ISO 8601 UTC start time (required) |
| `end_time` | string | ISO 8601 UTC end time (required) |
| `fps` | number | frames per second (default: 1.0) |
## example queries
try these in Claude or Cursor:
* "search for any mentions of 'project' in my screen recordings"
* "find audio transcriptions from the last hour"
* "show me what was on my screen in VS Code yesterday"
* "export a video of my screen from 10am to 11am today"
* "find what John said in our meeting about the API"
* "what did I type in Slack today?" (uses content\_type=input)
* "what did I copy to my clipboard recently?" (uses content\_type=input)
## testing
test your setup with MCP Inspector:
```bash theme={null}
npx @modelcontextprotocol/inspector npx screenpipe-mcp
```
## troubleshooting
| symptom | likely fix |
| ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| no MCP tools appear | restart the client and verify the config path |
| mcp not connecting | ensure screenpipe is running and reachable at `http://localhost:3030/health`, then restart the client after config changes |
| `npx` not found | install Node.js 18+ or use the one-click in-app setup |
| `403` or unauthorized | set `SCREENPIPE_LOCAL_API_KEY` or refresh API auth in settings |
| empty results | wait for capture, broaden the query, or verify `/search?limit=1` |
| client hangs on startup | run the inspector command above and check Node version |
| Claude Desktop on Windows cannot see config | check whether you use the normal or Microsoft Store/MSIX install |
| Codex does not see screenpipe | open a new Codex session after the app writes `~/.codex/config.toml` |
| HTTP transport not reachable | confirm `screenpipe-mcp-http` port and firewall/LAN rules |
| macOS automation not working | grant accessibility permissions in System Settings → Privacy & Security → Accessibility |
still stuck? [ask in our discord](https://discord.gg/screenpipe) — the community can help debug MCP issues.
## requirements
* screenpipe must be running on localhost:3030
* Node.js >= 18.0.0
## deeper guides
* [API recipes](/api-recipes)
* [privacy data flow](/privacy-data-flow)
* [pipe debugging](/pipe-debugging)
## manual config (advanced)
the per-client manual setups above (Claude Desktop, Codex) cover most cases. these extra targets are for editors not listed above:
**cursor (project-scoped)** — create `.cursor/mcp.json` in your project root:
```json theme={null}
{
"mcpServers": {
"screenpipe": {
"command": "npx",
"args": ["-y", "screenpipe-mcp"]
}
}
}
```
**from source:**
```bash theme={null}
git clone https://github.com/screenpipe/screenpipe
cd screenpipe/packages/screenpipe-mcp
npm install && npm run build
```
then point your editor to `node /path/to/screenpipe-mcp/dist/index.js`.
# meeting notes to follow-up
Source: https://docs.screenpipe.com/meeting-follow-up
Capture a meeting with screenpipe, verify the transcript, and produce decisions, owners, action items, and a reviewed follow-up email or CRM update draft.
meeting automation fails when it skips transcript quality and jumps straight to sending. use a short verification loop so names, decisions, owners, and dates remain trustworthy.
```mermaid theme={null}
flowchart TD
A["recording"] --> B["transcript"]
B --> C["verify names and gaps"]
C --> D["summary and action items"]
D --> E["human review"]
E --> F["send or update CRM"]
```
## step by step
Open **Settings → Recording**. select the needed microphone and system-audio devices, then record a short test. obtain consent where required and follow the meeting's recording policy.
After the call, open the meeting or timeline. check its start and end, transcript coverage, and whether screen context belongs to this meeting.
Correct names and merge or label speakers where useful. do not “repair” missing audio by inventing what someone probably said.
Ask for purpose, decisions, unresolved questions, objections, action items, owners, dates, and supporting transcript moments.
Verify every commitment, owner, number, and deadline. mark unclear items for confirmation.
Create a concise email or message from the verified notes. review tone, recipients, attachments, and promises before sending.
Only after review, copy the approved result into a CRM, ticket, project tracker, or shared notes system.
## notes prompt
```markdown theme={null}
Create meeting notes from this bounded transcript and screen context.
Sections:
- purpose and participants
- decisions made
- action items: owner, action, due date, evidence moment
- open questions
- objections or risks
- items that need confirmation
Rules:
- do not assign an owner or due date unless it was stated
- distinguish a proposal from an accepted decision
- quote sparingly
- state when the transcript is missing or unclear
```
## follow-up prompt
```markdown theme={null}
Draft a short follow-up from the verified meeting notes.
Confirm the decisions and action items without adding new promises.
Ask for confirmation on every unresolved owner or date.
Return the draft only. Do not send it or update another system.
```
for deeper speaker, transcript, and calendar setup, see [meeting intelligence](/meeting-intelligence) and [meeting transcription](/meeting-transcription).
# meeting intelligence: botless transcripts and summaries
Source: https://docs.screenpipe.com/meeting-intelligence
Use screenpipe for botless meeting memory: live transcripts, speaker naming, calendar context, summaries, transcript copy, and API automation.
screenpipe records meetings without a bot joining the call. it captures the meeting window, microphone, optional system audio, transcript, speaker labels, calendar context, and the surrounding screen history.
## summarize in one click
open a meeting note and hit **Summarize** — screenpipe reads the transcript *and* the screen captured during the call, then writes decisions, action items, and follow-ups into the note. summarize buttons sit at the top and bottom of the note dock.
## what screenpipe captures
| layer | what it adds |
| -------- | ----------------------------------------------------------------------------------------------- |
| screen | slides, docs, pricing pages, dashboards, chat, and CRM screens shared or viewed during the call |
| audio | local transcript from your microphone and selected audio sources |
| speakers | speaker IDs, names, aliases, similar-speaker suggestions, and merge history |
| calendar | attendee names, meeting title, and time window for better labeling |
| notes | AI summaries, action items, and follow-up context |
| timeline | frame links and time anchors you can revisit later |
## setup checklist
1. open **settings -> recording** and choose the microphone and system audio sources you want.
2. connect **Google Calendar** in **settings -> connections** if you want attendee-aware speaker naming.
3. open the meeting app normally: Zoom, Google Meet, Microsoft Teams, Slack huddles, or another call surface.
4. let screenpipe record and transcribe in the background.
5. open the meeting from the timeline or search with `content_type=audio`.
quick verification:
```bash theme={null}
curl http://localhost:3030/health
curl "http://localhost:3030/search?content_type=audio&limit=1"
```
calendar context is especially strong for 1:1 meetings. when the meeting has exactly two attendees, screenpipe can infer the other speaker more reliably.
## live transcript workflow
Use the meeting transcript sidebar to:
* rename a speaker once and propagate the label through the meeting
* search for similar speakers before merging duplicates
* copy the full transcript as plain text
* open the related timeline moment when you need visual context
* summarize the meeting with your default AI or a selected pipe
## summarize with a pipe
meeting summaries can use any installed or store pipe. use a pipe when you want a repeatable output format, CRM writeback, an Obsidian note, or a sales-call summary that always includes the same fields.
good summary-pipe instructions include:
```markdown theme={null}
Summarize the meeting in this format:
## decision
## customer pain
## objections
## action items
## follow-up email draft
Use transcript evidence and include timeline links when useful.
```
for customer calls, add evidence fields so the output is usable:
```markdown theme={null}
Summarize the meeting.
Include:
- customer goal
- current workflow
- objections or privacy concerns
- requested integrations
- next action
- exact transcript quotes only when useful
```
## speaker cleanup
```bash theme={null}
curl "http://localhost:3030/speakers/unnamed?limit=10"
curl -X POST http://localhost:3030/speakers/update \
-H "Content-Type: application/json" \
-d '{"id": 1, "name": "Sarah Chen"}'
curl "http://localhost:3030/speakers/similar?speaker_id=1"
curl -X POST http://localhost:3030/speakers/merge \
-H "Content-Type: application/json" \
-d '{"speaker_to_keep_id": 1, "speaker_to_merge_id": 2}'
```
name speakers from the UI first when you can. use the API when building cleanup tools or recurring workflows.
## meeting APIs
### list and search meetings
```bash theme={null}
# list recent meetings
curl "http://localhost:3030/meetings?limit=20"
# search by title, attendees, or notes (case-insensitive)
curl "http://localhost:3030/meetings?q=customer+sync&limit=20"
# filter by date range
curl "http://localhost:3030/meetings?start_time=2026-05-01T00:00:00Z&end_time=2026-05-31T23:59:59Z"
# combine search with date range
curl "http://localhost:3030/meetings?q=sprint&start_time=2026-05-01T00:00:00Z&limit=10"
```
the `q` parameter searches across meeting title, attendees, and notes with case-insensitive substring matching.
### manage meetings
```bash theme={null}
curl "http://localhost:3030/meetings/status"
curl -X POST http://localhost:3030/meetings/start
curl -X POST http://localhost:3030/meetings/stop
curl -X POST http://localhost:3030/meetings/merge \
-H "Content-Type: application/json" \
-d '{"meeting_ids": [12, 13]}'
```
use the meetings API when an automation needs meeting lists, search, current meeting status, merge cleanup, or downstream note updates.
## Zoom, Meet, and Teams tradeoffs
| tool | best setup | notes |
| --------------- | ------------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| Zoom | mic plus system audio, Zoom connection when you need cloud recording metadata | OAuth can enrich meeting metadata; local capture still works without a bot |
| Google Meet | mic plus system audio, Google Calendar connection | calendar attendee context helps speaker naming |
| Microsoft Teams | mic plus system audio, Teams or Microsoft 365 connection for structured context | useful for enterprise rollouts and meeting-linked docs |
## troubleshooting
| symptom | try this |
| ---------------------- | ------------------------------------------------------------------------------------------------------- |
| empty transcript | verify microphone permission, selected device, and `content_type=audio` search |
| late transcript | wait for the transcription batch to finish or switch to realtime transcription |
| speaker names wrong | connect calendar, rename the speaker, then merge similar speakers |
| duplicated meeting | use merge from the UI or `/meetings/merge` |
| summary missed context | choose a custom pipe that also searches screen text and accessibility context during the meeting window |
| audio dropouts | reduce batch duration, select fewer audio devices, or use a faster/cloud transcription engine |
## related pages
* [meeting transcription](/meeting-transcription)
* [connections](/connections)
* [API recipes](/api-recipes)
* [pipe debugging](/pipe-debugging)
# turn a verified meeting into a CRM update
Source: https://docs.screenpipe.com/meeting-to-crm
Extract reviewed contact, deal, decision, objection, and next-step fields from a meeting without automatically writing uncertain data.
the safest meeting-to-CRM workflow creates a proposed record beside the transcript. a person reviews it, resolves duplicates, and decides which fields belong in the CRM.
```mermaid theme={null}
flowchart TD
A["verified transcript"] --> B["proposed CRM fields"]
B --> C["duplicate and policy check"]
C --> D["human approval"]
D --> E["CRM update"]
```
## define the schema first
| field | extraction rule |
| -------------------- | --------------------------------------------------------------------------------- |
| contact and company | use stated identity or existing CRM record; do not infer from appearance or voice |
| stage | update only when the meeting contains an accepted stage-changing event |
| problem and use case | summarize the participant's stated need |
| objections and risks | preserve material nuance; avoid sentiment scoring |
| next step | require an explicit action; retain unknown owner or date |
| commercial terms | copy exact approved terms only; mark proposals as proposals |
## step by step
Confirm the correct meeting, participants, time range, and transcript coverage. fix important names and speaker labels before extracting fields.
List the CRM fields that are allowed to change and who may approve them. exclude internal-only notes and fields the meeting cannot support.
Create a table with current value if known, proposed value, source moment, and confidence. leave unsupported fields blank.
A quoted price, suggested timeline, or possible next step is not an agreement. preserve the exact evidence state.
Search the CRM for the contact, company, and open deal. check for a later email or meeting that changed the outcome.
Approve each changed field, especially stage, owner, amount, close date, and next action. remove private transcript detail.
Apply the approved changes through the CRM UI or connection, then read back the saved record. keep the extraction artifact for traceability if policy allows.
## extraction prompt
```markdown theme={null}
Create a proposed CRM update from this verified meeting transcript.
For each allowed field provide:
- current value, if supplied
- proposed value
- source transcript time
- evidence state: stated, accepted, proposed, inferred, or unknown
- whether human confirmation is required
Never infer identity, deal stage, amount, owner, close date, or sentiment.
Keep proposals separate from accepted decisions.
Return a draft only; do not update the CRM.
```
use [meeting follow-up](/meeting-follow-up) first when transcript quality or action items still need review.
# local meeting transcription for Zoom, Meet, and Teams
Source: https://docs.screenpipe.com/meeting-transcription
Automatically transcribe Zoom, Meet, and Teams meetings locally with screenpipe using Whisper speech-to-text and speaker diarization — no bot, no cloud.
screenpipe automatically transcribes all audio from your meetings, calls, and conversations. local Whisper is the default, and you can also connect an OpenAI-compatible transcription server.
for the full botless meeting workflow - live transcript, speaker cleanup, calendar enrichment, summaries, copy transcript, and APIs - see [meeting intelligence](/meeting-intelligence).
## languages
cloud transcription is multilingual. pick one language in **settings → recording → transcription** to force it, or leave the selection empty (or pick several) for automatic detection — non-English audio is detected and transcribed in its own language, not forced to English.
## setup
audio recording is enabled by default in the desktop app. configure audio devices and transcription engine in **settings**.
* **audio devices**: select which microphones and system audio to capture
* **transcription engine**: choose local Whisper, Deepgram, or an OpenAI-compatible endpoint
## use a local OpenAI-compatible server
screenpipe can send uncompressed WAV audio to any server that implements
`POST /v1/audio/transcriptions`. This keeps screenpipe's capture and search
workflow while letting a separate local runtime own transcription.
[Soniqo speech-swift](https://github.com/soniqo/speech-swift) provides the
endpoint on Apple Silicon. Install and start it on macOS with:
```bash theme={null}
brew install speech
speech-server --port 8080
```
On Linux or Windows, use a
[Soniqo Speech Core](https://github.com/soniqo/speech-core) package that includes
the same transcription endpoint. Download the model bundle, then start the
server:
```bash theme={null}
# Linux
speech download-models
speech serve
```
```powershell theme={null}
# Windows PowerShell, from the extracted package's bin directory
.\speech_download_models.ps1
.\speech-server.exe
```
In **settings → recording → transcription**, choose **OpenAI Compatible** and
set:
* **endpoint**: `http://127.0.0.1:8080`
* **model**: `whisper-1`
* **send raw WAV audio**: enabled
* **API key**: leave empty for a loopback-only server, or enter the server's bearer token
run **connection test** before restarting capture. the server does not need to
list models; screenpipe accepts a manually entered model name.
## search transcriptions
```bash theme={null}
# find discussions about a topic
curl "http://localhost:3030/search?q=budget+review&content_type=audio&limit=10"
# get today's meetings
curl "http://localhost:3030/search?content_type=audio&start_time=2026-02-11T00:00:00Z"
# filter by speaker
curl "http://localhost:3030/search?content_type=audio&speaker_ids=1,2"
curl "http://localhost:3030/search?content_type=audio&speaker_name=John"
```
## speaker identification
screenpipe automatically identifies different speakers. manage them via API:
### improve speaker identification with calendar
connect your **Google Calendar** to significantly improve speaker identification accuracy. screenpipe uses your calendar's attendee list to automatically name speakers during meetings — if a meeting has exactly 2 attendees, the other speaker is auto-identified without manual labeling.
to enable this:
1. go to **settings → connections → Google Calendar**
2. authorize screenpipe to access your calendar
3. during future meetings, attendee names from your calendar will automatically label speakers
this works best for 1:1 meetings and structured calls. for larger meetings (3+ attendees), calendar context is tagged to your notes for later reference.
```bash theme={null}
# get unnamed speakers for labeling
curl "http://localhost:3030/speakers/unnamed?limit=10"
# update a speaker's name
curl -X POST http://localhost:3030/speakers/update \
-H "Content-Type: application/json" \
-d '{"id": 1, "name": "John Smith"}'
# search speakers by name
curl "http://localhost:3030/speakers/search?name=john"
# merge duplicate speakers
curl -X POST http://localhost:3030/speakers/merge \
-H "Content-Type: application/json" \
-d '{"speaker_to_keep_id": 1, "speaker_to_merge_id": 2}'
# find similar speakers
curl "http://localhost:3030/speakers/similar?speaker_id=1"
```
## tips
* use a good microphone
* reduce background noise
* `whisper-large-v3-turbo` is faster with a small accuracy tradeoff; `whisper-large-v3` is the most accurate
* set language to English in settings if you only speak English (faster)
## long meetings and batch sizing
by default, screenpipe batches audio for transcription in chunks. each engine (Whisper, OpenAI, Deepgram) has its own configurable batch-duration limit.
if you notice meetings longer than one hour losing context between batches, you can customize the batch size in settings > advanced > `batch_max_duration_secs`. set to your meeting's typical duration to preserve context across the entire recording.
in smart/batch transcription mode, large meetings may be split across multiple transcription jobs. if you need full meeting context in a single batch, consider:
* switching to **realtime** transcription (transcription happens immediately as audio is captured, trading cost/latency for guaranteed continuity)
* increasing `batch_max_duration_secs` to match your meeting length (capped at each engine's configurable limit)
* using [retranscription API](/api/retranscribe-data) to re-process a full meeting with custom settings
## privacy
* local Whisper and loopback OpenAI-compatible endpoints keep transcription on your device
* audio files stored in `~/.screenpipe/data/`
* audio is sent off-device only when you select Deepgram or another remote endpoint
* disable audio recording in app settings
questions? [join our discord](https://discord.gg/screenpipe).
# msty - privacy-first AI with screen context
Source: https://docs.screenpipe.com/msty
Connect screenpipe to Msty's Toolbox via MCP (STDIO or HTTP) so this privacy-first desktop AI can search your screen history and meeting transcripts.
[Msty](https://msty.studio) is a privacy-first AI platform (desktop + web) that natively supports MCP via its Toolbox feature — both STDIO and HTTP modes. screenpipe works out of the box with Msty, giving it access to your screen history, audio transcriptions, and more.
## setup
### STDIO mode
1. make sure screenpipe is running on your machine
2. open Msty and go to **Settings** → **Toolbox**
3. add a new tool with the following configuration:
```json theme={null}
{
"mcpServers": {
"screenpipe": {
"command": "npx",
"args": ["-y", "screenpipe-mcp"]
}
}
}
```
4. save and enable the tool
### HTTP mode
if you need remote access, use the HTTP transport instead. start the HTTP MCP server:
```bash theme={null}
npx -y screenpipe-mcp-http --port 3031
```
then point Msty's Toolbox at the HTTP endpoint:
```json theme={null}
{
"mcpServers": {
"screenpipe": {
"url": "http://localhost:3031/mcp"
}
}
}
```
## usage
once configured, Msty can search your screen history and get context about what you've been working on:
```
> what was I working on this morning?
> find that documentation about async/await patterns I was reading earlier
> what error messages have I seen in my terminal today?
> search for the API response format I was looking at in the browser
```
## example workflows
**recall context from earlier:**
```
> I was reading a blog post about rust macros earlier today,
> search screenpipe and summarize the key points
```
**reference meeting discussion:**
```
> search my audio transcriptions for what was discussed
> about the deployment timeline, then help me plan next steps
```
**debug from memory:**
```
> I saw an error message flash on screen, search screenpipe
> to find it and help me fix the issue
```
**find code examples:**
```
> search screenpipe for the python code I was looking at
> in the browser yesterday about asyncio patterns
```
## available tools
screenpipe provides these MCP tools to Msty:
| tool | description |
| ------------------ | --------------------------------------------------------------------------------------- |
| `search-content` | search screen text (accessibility-first, OCR fallback), audio transcriptions, and input |
| `activity-summary` | lightweight overview of app usage, speakers, and recent texts for a time range |
| `search-elements` | search structured UI elements from the accessibility tree |
| `frame-context` | full accessibility tree, URLs, and text for a specific frame |
| `list-meetings` | list detected meetings with duration, app, and attendees |
| `export-video` | export screen recordings as MP4 for a time range |
## requirements
* screenpipe running on localhost:3030 (or localhost:3031 for HTTP mode)
* Msty desktop or web app
* Node.js >= 18.0.0
need help? [join our discord](https://discord.gg/screenpipe).
# obsidian - sync screen history to your notes
Source: https://docs.screenpipe.com/obsidian
Sync screenpipe's screen history and meeting transcripts into Obsidian via the Copilot plugin so you can query your activity from your local notes vault.
[Obsidian](https://obsidian.md) is a powerful knowledge base that works on local markdown files. with screenpipe, you can query your screen history and meeting transcriptions directly from Obsidian using AI plugins.
## setup with copilot plugin
the [Obsidian Copilot](https://github.com/logancyang/obsidian-copilot) plugin supports MCP servers, letting you query screenpipe from within Obsidian.
1. install the Copilot plugin from Obsidian community plugins
2. open Copilot settings → MCP Servers
3. add screenpipe:
```json theme={null}
{
"screenpipe": {
"command": "npx",
"args": ["-y", "screenpipe-mcp"]
}
}
```
4. restart Obsidian
now you can ask Copilot things like:
* "what was I reading about yesterday?"
* "find my meeting notes from this morning"
* "what code was I looking at in VS Code?"
## manual workflow
if you prefer not to use plugins, you can query screenpipe's API and paste results into notes:
```bash theme={null}
# search recent screen content
curl "http://localhost:3030/search?q=meeting&limit=10" | jq '.data[].content.text'
# get audio transcriptions from today
curl "http://localhost:3030/search?content_type=audio&limit=20"
```
## use cases
* **daily notes**: automatically pull what you worked on into daily notes
* **meeting notes**: capture transcriptions and screen context from meetings
* **research**: recall articles and documentation you've read
* **project logs**: track what you've done across different apps
## requirements
* screenpipe running on localhost:3030
* Obsidian with Copilot plugin (for MCP integration)
* Node.js >= 18.0.0
## troubleshooting
### Copilot plugin can't connect to screenpipe
1. verify screenpipe is running: `screenpipe health`
2. check it's accessible: `curl http://localhost:3030/health`
3. verify MCP command: `npx screenpipe-mcp --help`
4. if using CLI, set API key: `screenpipe auth`
5. restart Obsidian
### Queries return no results
* screenpipe hasn't indexed yet (wait 30+ seconds)
* recording is paused — check Settings → Recording
* try broad queries first: "what did I do today?"
### Sync pipe fails to write
1. verify vault path in pipe settings
2. check screenpipe has file permissions to vault folder
3. restart both apps
4. check logs: `SCREENPIPE_LOG=debug screenpipe`
### "Unauthorized" error from Copilot
screenpipe API requires authentication. Add to MCP settings:
```json theme={null}
{
"screenpipe": {
"command": "npx",
"args": ["-y", "screenpipe-mcp"],
"env": {"SCREENPIPE_LOCAL_API_KEY": "your_key_from_screenpipe_auth"}
}
}
```
need help? [join our discord](https://discord.gg/screenpipe).
# Ollama — run AI locally with screenpipe
Source: https://docs.screenpipe.com/ollama
Run open-source LLMs like Llama, Qwen, and Mistral locally with Ollama and screenpipe — completely free, private, and offline with no API keys required.
[Ollama](https://ollama.com) lets you run AI models locally on your machine. screenpipe integrates natively with Ollama — no API keys, no cloud, completely private.
## setup
### 1. install Ollama & pull a model
```bash theme={null}
# install from https://ollama.com then:
ollama run llama3.2
```
this downloads the model and starts Ollama. you can use any model — `llama3.2` is a good starting point (fast, works on most machines).
### 2. select Ollama in screenpipe
1. open the **screenpipe app**
2. click the **AI preset selector** (top of the chat/timeline)
3. click **Ollama**
4. pick your model from the dropdown (screenpipe auto-detects pulled models)
5. start chatting
that's it. screenpipe talks to Ollama on `localhost:11434` automatically.
## recommended models
| model | size | best for |
| ----------- | ------ | --------------------------------------------- |
| `llama3.2` | \~2 GB | fast, general use, recommended starting point |
| `gemma3:4b` | \~3 GB | strong quality for size, good for summaries |
| `qwen3:4b` | \~3 GB | multilingual, good reasoning |
pull any model with:
```bash theme={null}
ollama pull
```
## requirements
* [Ollama](https://ollama.com) installed and running
* at least one model pulled
* screenpipe running
## custom OpenAI-compatible endpoints
if you're running a custom LLM server (Qwen, vLLM, Text Generation WebUI, etc.), screenpipe auto-detects the endpoint format:
1. first tries OpenAI-compatible format: `GET {endpoint}/v1/models`
2. falls back to Ollama format: `GET {endpoint}/api/tags`
**if your endpoint uses neither format**, you may need to:
* check what path your server uses for model listing (`/models`, `/v1/list`, etc.)
* if unsure, test with curl first: `curl {your-endpoint}/path-to-models`
* join our [Discord](https://discord.gg/screenpipe) — we can help troubleshoot custom setups
example: a Qwen server on `http://localhost:5000` with OpenAI-compatible API should work automatically. if screenpipe can't find models, verify the server responds to: `curl http://localhost:5000/v1/models`
## troubleshooting
**"ollama not detected"**
* make sure Ollama is running: `ollama serve`
* check it's responding: `curl http://localhost:11434/api/tags`
**model not showing in dropdown?**
* pull it first: `ollama pull llama3.2`
* you can also type the model name manually in the input field
**slow responses?**
* try a smaller model (`llama3.2`)
* close other GPU-heavy apps
* ensure you have enough free RAM (model size + \~2 GB overhead)
## troubleshooting Azure & custom OpenAI endpoints
### Error: "unsupported tool use" or "does not support more than one tool call"
screenpipe sends multiple tool calls to the LLM for agentic features. some models (especially older Azure-hosted models like Phi-4, older Llama versions) don't support this.
**fixes:**
* use a model that supports tool use — most current frontier and mid-size open models do; check the model's documentation for tool/function-calling support
* or disable agentic features in your pipe prompts (remove tool calls, just ask for text summaries)
* on Azure, try switching to the latest model version available
### Error: "max tokens is not supported"
your endpoint doesn't recognize the `max_tokens` parameter that screenpipe sends.
**fixes:**
1. verify your endpoint supports OpenAI-compatible API: `curl -H "Authorization: Bearer YOUR_KEY" https://your-endpoint/v1/models`
2. if using Azure, ensure you're using the OpenAI-compatible endpoint format (not the old REST API format)
3. try a custom endpoint URL wrapper if your server needs parameter translation
### API key not being passed to screenpipe API
if screenpipe says "unauthorized" when accessing the local API, but your custom LLM endpoint is configured:
**cause:** screenpipe CLI doesn't automatically share API credentials with the local REST API server.
**fix:** configure your pipe or app to use the API key explicitly:
```bash theme={null}
curl "http://localhost:3030/search?limit=5" \
-H "Authorization: Bearer YOUR_SCREENPIPE_API_KEY"
```
or set the API key in screenpipe settings → API security → enable API key auth, then provide that key in your requests.
### Custom endpoint not responding / models not detected
screenpipe tries both OpenAI and Ollama formats. if neither works:
1. **test your endpoint manually:**
```bash theme={null}
curl https://your-endpoint/v1/models
curl https://your-endpoint/api/tags
```
(one should return a model list; if neither does, your server may use a different path)
2. **check authorization:**
```bash theme={null}
curl -H "Authorization: Bearer YOUR_KEY" https://your-endpoint/v1/models
```
3. **verify TLS/SSL:** if using https, ensure your certificate is valid (self-signed certs need special config)
4. **common endpoint paths:**
* OpenAI-compatible: `/v1/models`, `/v1/chat/completions`
* Ollama-compatible: `/api/tags`, `/api/generate`
* vLLM: `/v1/models` (OpenAI-compatible)
* Text Generation WebUI: `/api/v1/models` (may vary)
if stuck, [join our Discord](https://discord.gg/screenpipe) — share your endpoint URL structure and error logs.
need help? [join our discord](https://discord.gg/screenpipe) — get recommendations on models and configs from the community.
# OpenClaw - AI assistant with screenpipe memory
Source: https://docs.screenpipe.com/openclaw
Connect screenpipe to OpenClaw, a self-hosted personal AI that ties into WhatsApp, Telegram, Discord, and iMessage, so it can recall your screen history.
[OpenClaw](https://openclaw.ai) is a self-hosted personal AI assistant that connects to your messaging apps (WhatsApp, Telegram, Discord, iMessage, etc.) and can take actions on your behalf.
With screenpipe, OpenClaw can recall what you've seen on screen, reference past conversations, and answer questions about your digital history.
## quick setup
One command makes OpenClaw screenpipe-aware: it installs the screenpipe skills into OpenClaw's skills directory and registers the screenpipe MCP server in its config.
```bash theme={null}
npx -y screenpipe@latest agent setup openclaw
```
Restart OpenClaw and it can search your screen history, audio transcriptions, and memories. The command is idempotent (safe to re-run) and preserves any MCP servers you already had.
The same command wires up other agents too: `npx -y screenpipe@latest agent setup `.
Want to wire it up by hand, or run OpenClaw on another machine? See the manual and remote setups below.
## same machine (manual)
If OpenClaw and screenpipe run on the same machine, setup is straightforward.
### MCP
Add screenpipe to your OpenClaw MCP config:
```json theme={null}
{
"mcpServers": {
"screenpipe": {
"command": "npx",
"args": ["-y", "screenpipe-mcp"]
}
}
}
```
Restart OpenClaw — it will now have access to your screen history, audio transcriptions, and more.
You can test the MCP server independently:
```bash theme={null}
npx @modelcontextprotocol/inspector npx screenpipe-mcp
```
### custom skill (alternative)
Create `~/openclaw/skills/screenpipe/skill.md`:
````markdown theme={null}
---
name: screenpipe
description: Search screen recordings and audio transcriptions from the user's computer
tools:
- Bash
---
# screenpipe skill
Query the user's screen history via the local API at http://localhost:3030.
## search content
```bash
curl -s "http://localhost:3030/search?q=QUERY&limit=20"
```
## get recent activity
```bash
curl -s "http://localhost:3030/search?limit=10&content_type=all"
```
````
Restart OpenClaw to load the skill.
## different machines
If OpenClaw runs on a different machine (e.g., a VPS or home server) than screenpipe, the simplest path is to sync your data over and run the one-command setup. You can also query screenpipe's API over the network — see the options below.
### recommended: selective sync + one-command setup
**1. sync your data to the server (lightly).** screenpipe's remote sync pushes `~/.screenpipe` over SSH — no cloud account needed. Skip the heavy media and exclude anything sensitive, so you ship just text, transcripts, and memories:
```bash theme={null}
npx -y screenpipe@latest sync remote now \
--host openclaw.example.com --user ubuntu \
--key-path ~/.ssh/id_ed25519 --remote-path /home/ubuntu/.screenpipe \
--no-media \
--exclude "secrets/*" \
--disable-clipboard-capture
```
* `--no-media` skips screenshots and video — text, transcripts, and memories still sync.
* `--exclude ` is repeatable, and a `/.screenpipeignore` file (one glob per line) is honored too.
Put it on a timer for continuous sync (see the cron example below).
**2. point OpenClaw at the synced data.** On the server, one command writes the skill + MCP config targeting the local synced copy:
```bash theme={null}
npx -y screenpipe@latest agent setup openclaw --api-url http://localhost:3030
```
Headless `npx -y screenpipe@latest login` writes the cloud token where the engine reads it, so cloud features work on the server without the desktop app.
### option 1: query screenpipe's REST API directly
If both machines are on the same network, OpenClaw can query screenpipe's API directly. Use a custom skill:
Create `~/openclaw/skills/screenpipe/skill.md`:
````markdown theme={null}
---
name: screenpipe
description: Search screen recordings and audio transcriptions from the user's computer
tools:
- Bash
---
# screenpipe skill
Query the user's screen history via their screenpipe REST API at http://SCREENPIPE_IP:3030.
## search content
```bash
curl -s "http://SCREENPIPE_IP:3030/search?q=QUERY&limit=20"
```
## filter by type
```bash
# screen content (accessibility-first text plus OCR fallback)
curl -s "http://SCREENPIPE_IP:3030/search?q=QUERY&content_type=all"
# audio transcriptions
curl -s "http://SCREENPIPE_IP:3030/search?q=QUERY&content_type=audio"
```
## activity summary
```bash
curl -s "http://SCREENPIPE_IP:3030/activity-summary?start_time=2024-01-15T10:00:00Z&end_time=2024-01-15T18:00:00Z"
```
## list meetings
```bash
curl -s "http://SCREENPIPE_IP:3030/meetings?limit=20"
```
````
Replace `SCREENPIPE_IP` with the IP of the machine running screenpipe. If the machines aren't on the same network, use [Tailscale](https://tailscale.com) to create a private network between them.
### option 2: push data to the OpenClaw machine over SSH
Use screenpipe's built-in **remote sync** to push your `~/.screenpipe/` directory to the OpenClaw machine over SFTP. No screenpipe-cloud account needed — just SSH access to your server.
> **⚠️ clipboard sensitivity:** Remote sync includes clipboard events and content by default. If you're syncing to a less-trusted machine (VPS, shared server), disable clipboard capture first with `--disable-clipboard-capture` to avoid syncing passwords, API keys, or other sensitive data that flows through your clipboard.
On the laptop (or any machine recording):
```bash theme={null}
# one-shot push (excludes clipboard)
npx -y screenpipe@latest sync remote now \
--host openclaw.example.com \
--user ubuntu \
--key-path ~/.ssh/id_ed25519 \
--remote-path /home/ubuntu/.screenpipe \
--disable-clipboard-capture
# verify SSH first if you want
npx -y screenpipe@latest sync remote test --host ... --user ... --key-path ... --remote-path ...
# auto-discover candidate hosts from ~/.ssh/config
npx -y screenpipe@latest sync remote discover
```
Run that on a cron / launchd / systemd timer for continuous sync:
```bash theme={null}
# crontab -e — every 15 minutes (without clipboard)
*/15 * * * * npx -y screenpipe@latest sync remote now \
--host openclaw.example.com --user ubuntu \
--key-path /home/me/.ssh/id_ed25519 --remote-path /home/ubuntu/.screenpipe \
--disable-clipboard-capture
```
Or set env vars instead of flags: `SCREENPIPE_REMOTE_HOST`, `SCREENPIPE_REMOTE_USER`, `SCREENPIPE_REMOTE_KEY`, `SCREENPIPE_REMOTE_PATH`.
On the OpenClaw machine, point its skill at the synced directory or run a local screenpipe pointing to the same data dir — OpenClaw can then query `localhost:3030` as if the data were captured locally.
> The old **Settings → Cloud** sync flow is being phased out in favor of explicit remote sync setups. Use `npx -y screenpipe@latest sync remote` for new setups where you control the destination.
## available MCP tools
When connected via MCP (same machine setup), OpenClaw gets access to these tools:
| Tool | Description |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| **search-content** | Search screen text (accessibility-first with OCR fallback), audio transcriptions, user input. Supports time range, app, window, and speaker filters. |
| **activity-summary** | Lightweight overview of app usage, audio speakers, and recent texts for a time range (\~200 tokens). |
| **search-elements** | Search structured UI elements (buttons, links, text fields) from the accessibility tree. |
| **frame-context** | Get full accessibility tree, URLs, and text for a specific frame. |
| **list-meetings** | List detected meetings with duration, app, and attendees. |
| **export-video** | Export screen recordings as MP4 for a time range. |
The MCP server also provides **resources** (`screenpipe://context` for current time, `screenpipe://guide` for search strategy) and **prompts** (search-recent, find-in-app, meeting-notes).
## example prompts
Once configured, message OpenClaw from any chat app:
* "what was I reading about yesterday afternoon?"
* "find the slack message from john about the deployment"
* "what code was I looking at in cursor this morning?"
* "summarize my meetings from last week"
* "what tabs did I have open when researching that bug?"
* "when did I last see the budget spreadsheet?"
* "what did I copy to clipboard recently?"
* "show me what buttons I clicked in Figma today"
## build a second brain (automation)
the prompts above answer questions on demand. to have OpenClaw *proactively* segment your workflows, summarize your processes, and keep a living memory of you — like the [digital clone pipe](/pipe-store), but inside OpenClaw — paste the prompt from [build a second brain](/second-brain) into OpenClaw and let it run on a schedule.
prefer to run it inside the screenpipe app instead of OpenClaw? do the same thing as a [pipe](/pipes) — `npx -y screenpipe@latest pipe install && npx -y screenpipe@latest pipe enable ` (`bunx` works too).
## troubleshooting
**MCP not connecting?**
* Test the server: `npx @modelcontextprotocol/inspector npx screenpipe-mcp`
* Check screenpipe is running: `curl http://localhost:3030/health`
**remote machine can't reach screenpipe?**
* Check Tailscale is connected: `tailscale status`
* Check SSH tunnel is up: `curl http://localhost:3030/health` on the remote
* Make sure screenpipe is running on your computer
**no results from queries?**
* Verify screenpipe is running: `curl http://localhost:3030/health`
* Ensure screenpipe has screen recording permissions
# OpenCode - terminal AI with screen memory
Source: https://docs.screenpipe.com/opencode
Integrate screenpipe with OpenCode to give your terminal AI assistant access to your screen history, audio transcriptions, and app context.
[OpenCode](https://github.com/opencode-ai/opencode) is a powerful terminal-based AI coding assistant written in Go. it implements the [Agent Skills](https://opencode.ai/docs/skills) open standard, which means screenpipe skills work out of the box.
## setup
OpenCode discovers skills from multiple locations. copy the screenpipe skills to any of these:
### option 1: project-level
```bash theme={null}
# copy to current project
mkdir -p .opencode/skills
cp -r /path/to/screenpipe/.claude/agents/* .opencode/skills/
```
### option 2: user-level (global)
```bash theme={null}
# copy to home directory for all projects
mkdir -p ~/.opencode/skills
cp -r /path/to/screenpipe/.claude/agents/* ~/.opencode/skills/
```
### option 3: clone directly
```bash theme={null}
# clone screenpipe and symlink skills
git clone https://github.com/screenpipe/screenpipe ~/screenpipe
ln -s ~/screenpipe/.claude/agents ~/.opencode/skills/screenpipe
```
OpenCode uses the same Agent Skills format as Claude Code. files in `.claude/agents/` work in `.opencode/skills/` and vice versa.
## available skills
| skill | description |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `screenpipe-query` | search accessibility-first screen text, audio transcriptions, and UI events (keyboard input, clicks, app switches, clipboard) |
| `screenpipe-health` | check status, diagnose issues, verify permissions |
| `screenpipe-logs` | retrieve and analyze screenpipe logs |
## usage
OpenCode automatically discovers installed skills. invoke them in your prompts:
```bash theme={null}
# start OpenCode
opencode
> @screenpipe-query find what I was reading about docker compose
> @screenpipe-health check if recording is working
> @screenpipe-logs show me errors from today
```
or let OpenCode choose automatically:
```bash theme={null}
> what was I working on in VS Code this morning?
# OpenCode will invoke screenpipe-query
> is my screen recording working?
# OpenCode will invoke screenpipe-health
```
## MCP alternative
OpenCode also supports MCP servers. if you prefer MCP over skills:
```bash theme={null}
# add to your opencode config
opencode config mcp add screenpipe "npx -y screenpipe-mcp"
```
skills are more token-efficient than MCP. the OpenCode team recommends skills for most use cases, with MCP for external API integrations.
## example workflows
**context-aware coding:**
```
> I was looking at a react component earlier that had a cool
> animation effect, use screenpipe to find it and help me
> implement something similar
```
**recall documentation:**
```
> use screenpipe to find that kubernetes docs page I was
> reading about pod scheduling
```
**meeting follow-up:**
```
> what did we discuss in the team call about the database
> migration? use screenpipe to find it
```
**debug from memory:**
```
> there was an error in my terminal earlier, use screenpipe
> to find it and help me fix it
```
## skill format reference
screenpipe skills follow the Agent Skills standard:
```markdown theme={null}
---
name: screenpipe-query
description: Query screen recordings and audio transcriptions
tools:
- Bash
- WebFetch
---
# Screenpipe Query Agent
Instructions for querying screenpipe data...
```
you can customize these skills or create your own following the same format.
## requirements
* screenpipe running on localhost:3030
* OpenCode installed (`go install github.com/opencode-ai/opencode@latest`)
* skills copied to `.opencode/skills/` or `~/.opencode/skills/`
## troubleshooting
**skills not discovered?**
* run `opencode skills list` to see available skills
* verify files are in correct location with valid yaml frontmatter
* check skill file ends in `.md`
**queries returning no data?**
* verify screenpipe is running: `curl http://localhost:3030/health`
* check data exists: `curl "http://localhost:3030/search?limit=1"`
* ensure screenpipe has screen recording permissions
**OpenCode not using skills?**
* mention the skill explicitly: `@screenpipe-query find...`
* check skill description matches your query intent
still stuck? [ask in our discord](https://discord.gg/screenpipe).
# fix screen recording permission on macos for screenpipe
Source: https://docs.screenpipe.com/permissions
Grant, reset, and recover macOS Screen Recording permission for screenpipe — covers per-bundle-id TCC, tccutil commands, and System Settings steps.
screenpipe needs macOS Screen Recording permission to capture frames and run OCR on what you see. if the engine fails to start with a permission error — including the "engine stuck" screen during onboarding — this page walks through every recovery path.
## grant it (the normal path)
1. open **System Settings** → **Privacy & Security** → **Screen & System Audio Recording**.
2. toggle **screenpipe** ON. macOS will prompt you to quit and reopen — click **Quit & Reopen**.
3. restart screenpipe. the engine should start within a few seconds.
the in-app "open system settings" button on the stuck screen jumps straight to this pane.
## if you switched build channels
macOS's TCC database (transparency, consent & control) tracks Screen Recording permission **per bundle id**, not per app name. if you previously granted permission to one build and switched to another, the new build looks like a brand new app to macOS — your earlier grant doesn't apply.
screenpipe ships under four bundle ids:
| bundle id | channel |
| ------------------------ | ------------------------------------------- |
| `screenpi.pe` | production (stable release) |
| `screenpi.pe.beta` | beta channel |
| `screenpi.pe.dev` | local dev build (`cargo` / `bun tauri dev`) |
| `screenpi.pe.enterprise` | enterprise distribution |
the stuck screen shows which one you're running as. if it doesn't match the entry you've toggled in System Settings, you need to grant permission for the new bundle id.
this is the single most common cause of "engine stuck" during onboarding — confirmed by telemetry showing 90% of stuck users have no boot phase reported, which is exactly the signature of a permission rejection at spawn time.
## reset and re-request
when the permission is in a wedged terminal state — screenpipe shows in System Settings but toggling does nothing, or it doesn't show at all — wipe the TCC record for that bundle id and re-trigger the prompt.
the in-app **reset & re-request** button does this for you. it runs:
```bash theme={null}
tccutil reset ScreenCapture
```
you can run it manually from Terminal too. for each bundle id you have installed:
```bash theme={null}
# production build
tccutil reset ScreenCapture screenpi.pe
# beta channel
tccutil reset ScreenCapture screenpi.pe.beta
# local dev build
tccutil reset ScreenCapture screenpi.pe.dev
# enterprise distribution
tccutil reset ScreenCapture screenpi.pe.enterprise
```
no sudo required — TCC's per-app records live in your user scope.
after reset, relaunch screenpipe. macOS will prompt fresh.
## nuclear option
if per-bundle resets don't recover, wipe every app's Screen Recording grant in one shot:
```bash theme={null}
tccutil reset ScreenCapture
```
this affects every screen-recording app on your machine (zoom, OBS, cleanshot, etc.) — they'll all re-prompt on next launch. only use this if the scoped resets above failed.
## related permissions
screen recording is the most failure-prone, but screenpipe also asks for:
* **microphone** — for audio capture. System Settings → Privacy & Security → Microphone. reset: `tccutil reset Microphone `
* **accessibility** — for app/window context. System Settings → Privacy & Security → Accessibility. reset: `tccutil reset Accessibility `
* **input monitoring** — for keystrokes (optional). System Settings → Privacy & Security → Input Monitoring. reset: `tccutil reset ListenEvent `
the same per-bundle-id rules apply to all of these.
## audio capture is missing or silent
If screenpipe records the screen but no microphone audio, first verify that the microphone is enabled in **System Settings** → **Privacy & Security** → **Microphone**. External microphones and USB sound cards must also be selected as the input device in the screenpipe recording settings; reconnect the device and restart screenpipe after changing it. If the device is busy or disappears after sleep, quit other apps using the microphone, reconnect the device, and restart screenpipe so audio capture can reopen the stream.
To confirm which devices screenpipe can see, query the local API:
```bash theme={null}
curl http://localhost:3030/audio/list
```
If the expected device is not listed, macOS or the device driver has not exposed it to screenpipe yet. Check that the device works in **System Settings** → **Sound** → **Input**, then relaunch screenpipe. The microphone permission reset below uses the app's bundle ID, just like Screen Recording permission.
## still stuck?
send logs from the stuck screen (the **send logs** button uploads them so the team can grep). or book a slot at [cal.com/team/screenpipe/chat](https://cal.com/team/screenpipe/chat).
see also: [general troubleshooting](/troubleshooting), [FAQ](/faq).
# debug screenpipe pipes
Source: https://docs.screenpipe.com/pipe-debugging
A practical debugging guide for screenpipe pipes: schedules, logs, API access, AI provider auth, connection proxies, permissions, and stuck runs.
when a pipe fails, debug it like a small production job: confirm the engine is alive, confirm the pipe has data, confirm the AI provider works, then inspect logs and permissions.
## fast triage
| check | command or screen | what it tells you |
| ---------- | ------------------------------------------------------ | ------------------------------- |
| engine | `curl http://localhost:3030/health` | screenpipe API is alive |
| data | `curl "http://localhost:3030/search?limit=5"` | there is searchable context |
| pipe list | `curl http://localhost:3030/pipes` | pipe is installed and enabled |
| logs | `curl http://localhost:3030/pipes//logs` | last stdout, stderr, and errors |
| manual run | `curl -X POST http://localhost:3030/pipes//run` | schedule is not the blocker |
| stop | `curl -X POST http://localhost:3030/pipes//stop` | clears a stuck execution |
## lifecycle
```mermaid theme={null}
flowchart LR
A["pipe.md"] --> B["installed pipe"]
B --> C["enabled schedule"]
C --> D["run queued"]
D --> E["AI agent executes"]
E --> F["screenpipe API search"]
E --> G["connection proxy calls"]
E --> H["files, memories, notifications, or external APIs"]
E --> I["logs and session file"]
```
## common failures
| symptom | likely cause | fix |
| ----------------------------------- | -------------------------------------------------- | ----------------------------------------------------------------- |
| run never starts | pipe disabled or another run is queued | enable it, stop stale runs, run manually |
| no useful output | prompt did not require a durable output | tell the pipe exactly where to write, notify, or summarize |
| "connection refused" | local API still booting | wait for `/health`, then rerun |
| "unauthorized" | API auth or provider key missing | set `SCREENPIPE_API_KEY`, sign in, or update provider credentials |
| empty search results | time range too narrow or capture disabled | widen the window and verify `/search?limit=5` |
| Windows terminal flashes and closes | process crashed immediately | open pipe logs or run script from PowerShell |
| pipe sees old data only | schedule window or stale filters | remove filters, run manually, widen time range |
| custom window not found | exact window title differs | search broad, then inspect stored `window_name` |
| notification does not fire | condition, integration, or OS notification setting | test each step outside the pipe |
| provider timeout | model slow, batch too large, or network issue | use faster model, add timeout, or rerun |
| connection API fails | integration disconnected or missing proxy path | reconnect the integration and use `/connections//proxy/...` |
| permission denied | pipe permissions too narrow | update `pipe-permissions` allowlist |
## windows pipe exits immediately
if a black command window appears and disappears, the pipe process is probably crashing before you can read the error.
1. open **Pipes → My Pipes**, select your pipe, and open its logs.
2. run the pipe manually.
3. if the pipe calls a script, run that script directly in PowerShell.
4. confirm `pipe.md` exists in the pipe folder and has valid frontmatter.
5. confirm the local API is alive:
```bash theme={null}
curl http://localhost:3030/health
```
then search broadly:
```bash theme={null}
curl "http://localhost:3030/search?limit=5&content_type=all"
```
do not debug the schedule until manual run works.
## write prompts with debuggable outputs
weak:
```markdown theme={null}
Tell me what I did today.
```
strong:
```markdown theme={null}
Search the last 24 hours of screenpipe data.
Write a markdown summary to ~/Documents/daily-screenpipe-summary.md.
Include:
- accomplishments
- meetings
- open loops
- timeline links for the 5 most important moments
If there is no data, say which API call returned empty.
```
for monitoring pipes, add a "no match" behavior:
```markdown theme={null}
Search the last 10 minutes for the window named "Operations Dashboard".
If you find a red error banner, send a desktop notification.
If the window is missing or no error is visible, write a log line explaining which case happened.
Never send an alert unless the evidence is present in screenpipe results.
```
## frontmatter checklist
```yaml theme={null}
---
schedule: every 30m
enabled: true
timeout: 600
permissions:
allow:
- /search
- /activity-summary
- /meetings
---
```
keep the schedule simple until the pipe works manually. add permissions only for the APIs the pipe needs.
## secrets and provider auth
do:
* keep API keys in `.env` next to `pipe.md`
* use connected app proxies when possible
* use local models through Ollama for fully local execution
* use `SCREENPIPE_API_KEY` when API auth is enabled
do not:
* paste API keys into the prompt body
* ask the AI to print secrets
* grant broad write access before the pipe is proven
## connection proxies
connected apps can be called without exposing secrets to the pipe prompt:
```bash theme={null}
curl "http://localhost:3030/connections/google-calendar/events?hours_ahead=8"
curl "http://localhost:3030/connections/notion/proxy/v1/search"
curl "http://localhost:3030/connections/hubspot/proxy/crm/v3/objects/contacts"
```
exact proxy paths depend on the integration. see [connection reference](/connection-reference).
## search filters that usually break custom pipes
start with broad search, then add filters one at a time.
```bash theme={null}
curl "http://localhost:3030/search?limit=10&content_type=all"
curl "http://localhost:3030/search?limit=10&content_type=accessibility"
curl "http://localhost:3030/search?limit=10&content_type=ocr"
curl "http://localhost:3030/search?limit=10&content_type=audio"
```
use `content_type=all` or `content_type=accessibility` for most app text. OCR is fallback pixel text, not the main source of screen text on platforms where accessibility data is available.
when filtering by window, first inspect real stored window names from broad results. the visible title bar and stored `window_name` can differ.
avoid this while debugging:
```bash theme={null}
curl "http://localhost:3030/search?limit=50&content_type=ocr&window_name=Exact%20Title"
```
prefer:
```bash theme={null}
curl "http://localhost:3030/search?limit=20&content_type=all"
```
then add `window_name`, `app_name`, `start_time`, or `end_time` only after you know the data exists.
## notifications and external actions
if a pipe should play a sound, show a notification, send Telegram, update Notion, or call a webhook, split the debugging:
| layer | test |
| ----------- | ----------------------------------------------------- |
| capture | does `/search` find the condition? |
| decision | does the prompt explain why it will or will not act? |
| integration | does the notification/API call work outside the pipe? |
| permissions | can the pipe call the endpoint or command? |
| schedule | does the pipe run manually before relying on cron? |
make the pipe log every skipped action. silent "no-op" runs are hard to debug.
## when to use chat, MCP, or pipes
| job | use |
| ---------------------------------------------- | --------------------- |
| one question about recent activity | chat |
| external AI assistant needs screen memory | MCP |
| recurring workflow or scheduled output | pipe |
| structured integration with CRM/calendar/notes | pipe plus connections |
| local script or app integration | REST API |
## collect a useful bug report
include:
* pipe name and `pipe.md`
* schedule and whether manual run works
* output of `curl http://localhost:3030/health`
* output of `curl http://localhost:3030/pipes//logs`
* AI provider and model
* whether API auth is enabled
* OS and screenpipe version
## related pages
* [pipes](/pipes)
* [pipe permissions](/pipe-permissions)
* [API recipes](/api-recipes)
* [connections](/connections)
# pipe permissions: scope API access for screenpipe pipes
Source: https://docs.screenpipe.com/pipe-permissions
Control which screenpipe API endpoints your pipes can access by allowlisting endpoints, restricting writes, and scoping permissions per automation.
## overview
pipes can access the screenpipe API to read screen data, manage meetings, send notifications, and more. by default, pipes have **full access** to every endpoint — no restrictions.
if you want to limit what a pipe can do, add a `permissions` block to the YAML frontmatter in `pipe.md`. this is useful for:
* **preventing accidents** — a pipe that reads meetings shouldn't be able to stop one
* **least privilege** — pipes from the store should only access what they need
* **safety** — deny destructive endpoints like `/data/delete-range`
## quick start
```yaml theme={null}
---
schedule: every 30m
permissions: reader
---
Summarize my screen activity...
```
that's it. this pipe can only read data — it can't start/stop meetings, delete data, or run raw SQL.
## presets
### `reader` — safe read-only defaults
```yaml theme={null}
permissions: reader
```
allowed endpoints:
| method | endpoint | description |
| ------ | ------------------- | ------------------------------------- |
| GET | `/search` | query screen/audio data |
| GET | `/activity-summary` | app usage overview |
| GET | `/elements` | UI element search |
| GET | `/frames/*` | screenshots (if `allow_frames: true`) |
| GET | `/meetings` | list meetings |
| GET | `/meetings/*` | get meeting details |
| GET | `/meetings/status` | check if in meeting |
| POST | `/notify` | send notifications |
| GET | `/speakers` | list speakers |
| POST | `/speakers/update` | update speaker names |
| GET | `/pipes/info` | pipe metadata |
| GET | `/health` | health check |
| GET | `/connections/*` | connection credentials |
everything else is **denied**.
### `writer` — reader + write operations
```yaml theme={null}
permissions: writer
```
includes all `reader` endpoints, plus:
| method | endpoint | description |
| ------ | ----------------- | ---------------------- |
| POST | `/meetings/start` | start a manual meeting |
| POST | `/meetings/stop` | stop a manual meeting |
| PUT | `/meetings/*` | update meeting details |
| POST | `/meetings/merge` | merge meetings |
| POST | `/memories` | create memories |
| PUT | `/memories/*` | update memories |
| DELETE | `/memories/*` | delete memories |
### `admin` — full access (explicit)
```yaml theme={null}
permissions: admin
```
allows everything. functionally the same as no `permissions` block, but creates a token for logging/auditing.
## custom rules
for fine-grained control, use `allow` and `deny` lists with `Api(METHOD /path)` patterns:
```yaml theme={null}
permissions:
allow:
- Api(GET /search)
- Api(GET /meetings/*)
- Api(POST /notify)
deny:
- Api(* /data/delete-*)
```
### pattern syntax
| pattern | matches |
| ----------------------- | ------------------------------------------------- |
| `Api(GET /search)` | exact: GET to /search |
| `Api(GET /meetings/*)` | glob: GET to /meetings/42, /meetings/status, etc. |
| `Api(* /meetings/stop)` | any method to /meetings/stop |
| `Api(POST /notify)` | exact: POST to /notify |
| `Api(* /data/*)` | any method to any /data/ subpath |
`*` in the method position matches GET, POST, PUT, DELETE, etc.
`*` in the path position matches any sequence of characters.
### evaluation order
rules are evaluated in this order — **first match wins**:
1. **deny** — if the request matches any deny rule, it's blocked (403)
2. **allow** — if the request matches any allow rule, it passes
3. **default allowlist** — if `allow` is empty and the pipe uses a preset with defaults (reader/writer), the default list is checked
4. **reject** — if nothing matched, the request is blocked
deny always wins over allow, just like firewall rules.
### examples
**deny specific endpoints (keep full access otherwise):**
```yaml theme={null}
permissions:
deny:
- Api(* /meetings/stop)
- Api(* /meetings/start)
- Api(DELETE /meetings/*)
- Api(* /data/delete-*)
```
**allow only what you need (everything else denied):**
```yaml theme={null}
permissions:
allow:
- Api(GET /search)
- Api(POST /notify)
```
**reader defaults + custom deny:**
```yaml theme={null}
permissions:
deny:
- Api(GET /frames/*)
```
this uses the reader defaults but also blocks screenshot access.
## data access rules
data filtering uses the same `allow`/`deny` lists with `App()`, `Window()`, and `Content()` rules:
```yaml theme={null}
---
schedule: every 1h
permissions:
allow:
- Api(GET /search)
- App(Slack, Chrome)
- Window(*meeting*)
- Content(accessibility, audio)
deny:
- App(1Password, Signal)
- Window(*incognito*, *bank*)
- Content(input)
time: "09:00-17:00"
days: "Mon,Tue,Wed,Thu,Fri"
---
```
| rule type | syntax | description |
| --------------- | ------------------------------------ | -------------------------------------------------------------- |
| `App(name)` | `App(Slack)` or `App(Slack, Chrome)` | filter by app name (case-insensitive substring match) |
| `Window(glob)` | `Window(*meeting*)` | filter by window title (glob pattern) |
| `Content(type)` | `Content(accessibility, audio)` | filter content types: `accessibility`, `ocr`, `audio`, `input` |
| `time` | `"09:00-17:00"` | daily time window — supports midnight wrap (`"22:00-06:00"`) |
| `days` | `"Mon,Tue,Wed,Thu,Fri"` | allowed days of the week |
deny rules always win over allow rules. if no rules of a given type exist, everything is allowed.
## how it works
when a pipe has any restrictions (permissions block, data filters, etc.):
1. screenpipe generates a unique token (`sp_pipe_*`) for the pipe session
2. the token is registered with the server middleware
3. every API request from the pipe includes the token in `Authorization: Bearer sp_pipe_*`
4. the middleware checks `is_endpoint_allowed(method, path)` before forwarding
5. the Pi extension also enforces rules client-side (blocks curl commands before they run)
6. when the pipe finishes, the token is cleaned up
pipes without any restrictions run without a token — full access, zero overhead.
## common recipes
### meeting-safe pipe
your pipe reads meeting data but should never interfere with active meetings:
```yaml theme={null}
---
schedule: every 1h
permissions:
deny:
- Api(* /meetings/start)
- Api(* /meetings/stop)
- Api(POST /meetings/merge)
- Api(POST /meetings/bulk-delete)
- Api(DELETE /meetings/*)
---
Summarize my meetings from the last hour...
```
### read-only analytics pipe
```yaml theme={null}
---
schedule: daily
permissions:
allow:
- Api(GET /search)
- App(Chrome, Arc, Firefox)
- Content(accessibility)
---
Generate a daily browsing report...
```
### work-hours-only pipe
```yaml theme={null}
---
schedule: every 30m
permissions:
time: "09:00-17:00"
days: "Mon,Tue,Wed,Thu,Fri"
---
Track my work activity...
```
full API access, but time and day restrictions limit when data is visible.
need help? [ask in our discord](https://discord.gg/screenpipe)
# pipe store — browse all automations
Source: https://docs.screenpipe.com/pipe-store
Browse every screenpipe pipe: digital clone, meeting intelligence, time tracking, Obsidian sync, CRM, and more. One-click install from the app.
pipes are AI automations that run on your screen data. to install: open **Pipes → Discover**, choose a pipe, and click **GET**. the app switches to **My Pipes**, where you can review its permissions, run it, and enable a schedule.
you can also browse and install pipes at [screenpi.pe/pipes](https://screenpi.pe/pipes).
***
## featured
most popular memory pipe
saves and maintains memories of who you are. builds a digital representation of your knowledge, preferences, and patterns over time.
**best for:** personal AI memory, building context that persists across conversations.
botless meeting memory
AI meeting summaries enriched with relationship history, screen context, and memories — gets smarter over time. goes beyond basic transcription.
**best for:** sales calls, recurring meetings, relationship tracking across conversations.
local notes sync
writes a daily summary of your screen activity directly into your Obsidian vault.
**best for:** daily journaling, building a personal knowledge base, connecting screen context to your notes.
task tracking
keeps track of things you need to do and reminds you regularly of important tasks based on your screen activity.
**best for:** task management, staying on top of action items mentioned in meetings or messages.
AI workflow journal
captures every prompt you send to AI tools (ChatGPT, Claude, Gemini, Perplexity, etc.) and saves them to a daily markdown journal.
**best for:** building a searchable archive of your AI conversations, reviewing your thought process.
***
## productivity
distraction detection
detects when you're distracted based on your active app and sends you a notification to get back on track.
**best for:** deep work sessions, reducing context-switching, staying focused on a specific task.
automatic time tracking
automatically tracks your time in Toggl based on which apps you're using. no manual time entries needed.
**best for:** freelancers, consultants, anyone who bills by the hour.
sales workflow sync
auto-detects business calls and syncs them to your Notion CRM. extracts contacts, company, deal stage, and action items from conversation transcripts.
**best for:** sales teams, founders, anyone tracking deals in Notion.
relationship memory
remember everyone you meet, what you discussed, and when to follow up. builds relationship context automatically from your screen and audio data.
**best for:** networking, sales, managing relationships across many contacts.
research assistant
deep-dives into topics based on your screen activity — finds non-obvious insights you wouldn't Google yourself.
**best for:** researchers, curious people, discovering connections between topics you're exploring.
## sync & integrations
local message sync
synchronizes your iMessages into the screenpipe database so they're searchable alongside your screen data.
**best for:** searching old messages, giving AI context about your conversations.
voice memo memory
transcribes and indexes iPhone Voice Memos synced via iCloud. auto-processes new recordings, transcribes via Deepgram, summarizes with AI, and stores as searchable memories.
**best for:** people who use Voice Memos for quick thoughts, meeting notes, or brainstorming.
the Store is a live catalog and changes independently of the app release. search **Discover** for the current availability, version, permissions, and connections before relying on a pipe in a workflow.
***
## troubleshooting
### pipe installed from store but not showing in UI
**problem**: you click GET on a pipe, the install succeeds, but the pipe doesn't appear in **Pipes → My Pipes**.
**solution**:
1. switch back to **Discover**, then return to **My Pipes** and wait a few seconds for the list to refresh.
2. check that the pipe folder exists:
* **macOS/Linux**: `ls ~/.screenpipe/pipes/` and verify the pipe name appears
* **Windows**: `dir %USERPROFILE%\.screenpipe\pipes\` (or `echo $env:USERPROFILE\.screenpipe\pipes` in PowerShell)
3. if the folder is missing, re-run the install from the pipe store.
4. verify screenpipe API is healthy: `curl http://localhost:3030/health`
### pipes disappearing from UI
**problem**: pipes you installed are gone from **My Pipes**.
**solution**: screenpipe uses a **tombstone system** to track deleted pipes and prevent them from being restored. a pipe may be marked as deleted if:
* you deleted it from **Pipes → My Pipes**
* you uninstalled the app (rebuilding the pipe list removes orphaned pipes)
* the pipe folder was manually deleted from `~/.screenpipe/pipes/`
**to recover**:
1. look for the pipe in **Pipes → My Pipes**
2. if it is absent, search **Discover** and click **GET** to reinstall
3. if the Store reports success but the pipe remains absent, collect the app version, pipe name, and execution logs, then use [pipe debugging](/pipe-debugging)
avoid deleting pipe folders or editing `.tombstones.json` manually. use the app's delete and reinstall actions so its installed-state records stay consistent.
### pipe install succeeds but doesn't execute
**problem**: the pipe is installed and enabled, but scheduled runs produce no output or logs.
**solution**: the issue is usually the pipe execution, not the installation. see [debug screenpipe pipes](/pipe-debugging) for execution troubleshooting (logs, API health, provider auth).
## built-in Home shortcuts
these four shortcuts ship with the current app and are available on Home without a Store install:
| pipe | what it does |
| -------------------- | ------------------------------------------------------------ |
| **Automate My Work** | find one repeated workflow and propose a testable automation |
| **Day Recap** | summarize accomplishments, key moments, and unfinished work |
| **Time Breakdown** | review app, project, and category activity |
| **Missed To-Dos** | find likely unresolved commitments from recent work |
***
## create your own pipe
a pipe is just one markdown file. you can create a custom pipe for anything — then [publish it to the store](https://screenpi.pe/pipes) for others to use.
### quick way: use the in-app builder
open **Pipes → My Pipes**, scroll to **create your own pipe**, and describe the result in plain English. for example:
```text theme={null}
Every weekday at 5pm, create a local Markdown recap of my verified work,
open loops, and capture gaps. Do not send it or change another system.
```
the app opens Home, asks the agent to build and install the pipe, then the result appears in **My Pipes**. run it once and inspect the artifact and execution log before keeping the schedule enabled.
### manual way: write it yourself
```bash theme={null}
mkdir -p ~/.screenpipe/pipes/my-pipe
cat > ~/.screenpipe/pipes/my-pipe/pipe.md << 'EOF'
---
schedule: every 30m
enabled: true
---
Your instructions here. The AI agent will execute this prompt
and can query screenpipe at http://localhost:3030/search.
EOF
```
then open **Pipes → My Pipes**. the local pipe folder is discovered and appears in the installed list.
[full pipe development guide →](/pipes)
### publishing to the pipe store
ready to share your pipe with the community? visit [screenpi.pe/pipes](https://screenpi.pe/pipes) and click **Submit a Pipe**. you'll need to provide:
* **pipe name** — what users will see in the store
* **description** — 1–2 sentences explaining what your pipe does
* **icon** — a visual thumbnail for the store
* **pipe.md source** — either paste your markdown directly or link to a GitHub raw file
* **tags** — `productivity`, `automation`, `integration`, etc.
screenpipe maintainers review submissions and feature the best ones. once published, users can install your pipe with one click from the app.
***
## what makes pipes powerful
| feature | description |
| -------------------- | ----------------------------------------------------------------------------------- |
| **zero code** | pipes are plain markdown — describe what you want in natural language |
| **any schedule** | run every 5 minutes, hourly, daily, or on-demand |
| **full API access** | query screen text, audio, browser URLs, app activity, input events |
| **any AI model** | use screenpipe cloud, your ChatGPT/Claude subscription, or local Ollama |
| **external APIs** | pipes can call Slack, Toggl, Notion, Google Calendar — anything with an API |
| **privacy controls** | restrict what data a pipe can access with [permissions](/pipe-permissions) |
| **publishable** | share your pipes with the community via the [pipe store](https://screenpi.pe/pipes) |
need help building a pipe? [join our discord](https://discord.gg/screenpipe) — share your pipes and see what others are building.
# pipes — build your own automations
Source: https://docs.screenpipe.com/pipes
Build custom AI automations that run on your screen data. Pipes are scheduled AI agents written in plain markdown — prompt plus schedule, no code required.
looking for ready-to-use pipes? [browse the pipe store →](/pipe-store). if a pipe fails, use [pipe debugging](/pipe-debugging).
## browse and install community pipes
to find and install pipes others have made:
1. open screenpipe and click **Pipes** in the sidebar
2. click the **Discover** tab at the top
3. browse featured and community pipes, or search for a specific one
4. click **GET** to install any pipe
5. open **My Pipes** to run it, enable it, and configure the schedule
you can also browse all available pipes online at [screenpi.pe/pipes](https://screenpi.pe/pipes) before installing.
## quick start — paste this into claude code
copy this prompt into [claude code](https://docs.anthropic.com/en/docs/claude-code), [cursor](https://cursor.com), or any AI coding assistant:
```text create a pipe theme={null}
create a screenpipe pipe that [DESCRIBE WHAT YOU WANT].
## what is screenpipe?
screenpipe is a desktop app that captures your screen text primarily through accessibility APIs, falls back to OCR when needed, and records audio transcriptions.
it runs a local API at http://localhost:3030 that lets you query everything you've seen, said, or heard.
## what is a pipe?
a pipe is a scheduled AI agent defined as a single markdown file: ~/.screenpipe/pipes/{name}/pipe.md
every N minutes, screenpipe runs a coding agent (like pi or claude-code) with the pipe's prompt.
the agent can query your screen data, write files, call external APIs, send notifications, etc.
## pipe.md format
the file starts with YAML frontmatter, then the prompt body:
---
schedule: every 30m
enabled: true
---
Your prompt instructions here...
## context header
before execution, screenpipe prepends a context header to the prompt with:
- time range (start/end timestamps based on the schedule interval)
- current date
- user's timezone
- screenpipe API base URL
- output directory
the AI agent uses this context to query the right time range. no template variables needed in the prompt.
## screenpipe search API
the agent queries screen data via the local REST API:
curl -H "Authorization: Bearer $SCREENPIPE_LOCAL_API_KEY" \
"http://localhost:3030/search?limit=20&content_type=all&start_time=&end_time="
### query parameters
- q: text search query (optional)
- content_type: "all" | "ocr" | "audio" | "input" | "accessibility"
- limit: max results (default 20)
- offset: pagination offset
- start_time / end_time: ISO 8601 timestamps
- app_name: filter by app (e.g. "chrome", "cursor")
- window_name: filter by window title
- browser_url: filter by URL (e.g. "github.com")
- min_length / max_length: filter by text length
- speaker_ids: filter audio by speaker IDs
### screen text results (what was on screen)
each result contains:
- text: extracted accessibility text or OCR fallback text visible on screen
- app_name: which app was active (e.g. "Arc", "Cursor", "Slack")
- window_name: the window title
- browser_url: the URL if it was a browser
- timestamp: when it was captured
- file_path: path to the video frame
- focused: whether the window was focused
### audio results (what was said/heard)
each result contains:
- transcription: the spoken text
- speaker_id: numeric speaker identifier
- timestamp: when it was captured
- device_name: which audio device (mic or system audio)
- device_type: "input" (microphone) or "output" (system audio)
### accessibility results (accessibility tree text)
each result contains:
- text: text from the accessibility tree
- app_name: which app was active
- window_name: the window title
- timestamp: when it was captured
### input results (user actions)
query via: curl -H "Authorization: Bearer $SCREENPIPE_LOCAL_API_KEY" "http://localhost:3030/search?content_type=input&app_name=Slack&limit=50&start_time=&end_time="
event types: text (keyboard input), click, app_switch, window_focus, clipboard, scroll
## local API authentication and secrets
screenpipe injects `SCREENPIPE_LOCAL_API_KEY` into pipe runs. add `-H "Authorization: Bearer $SCREENPIPE_LOCAL_API_KEY"` to every protected local API request.
store keys for external services in a .env file next to pipe.md (never in the prompt itself):
echo "API_KEY=your_key" > ~/.screenpipe/pipes/my-pipe/.env
reference in prompt: source .env && curl -H "Authorization: Bearer $API_KEY" ...
## after creating the file
use the desktop app: go to **Pipes → My Pipes** to enable, run, and view logs. browse and install pipes from the **Discover** tab.
or use the REST API:
install: curl -X POST http://localhost:3030/pipes/install -H "Authorization: Bearer $SCREENPIPE_LOCAL_API_KEY" -H "Content-Type: application/json" -d '{"source": "~/.screenpipe/pipes/my-pipe"}'
enable: curl -X POST http://localhost:3030/pipes/my-pipe/enable -H "Authorization: Bearer $SCREENPIPE_LOCAL_API_KEY" -H "Content-Type: application/json" -d '{"enabled": true}'
test: curl -X POST http://localhost:3030/pipes/my-pipe/run -H "Authorization: Bearer $SCREENPIPE_LOCAL_API_KEY"
logs: curl http://localhost:3030/pipes/my-pipe/logs -H "Authorization: Bearer $SCREENPIPE_LOCAL_API_KEY"
```
replace `[DESCRIBE WHAT YOU WANT]` with your use case — e.g. "tracks my time in toggl based on what apps I'm using", "writes daily summaries to obsidian", "sends me a slack message if I've been on twitter for more than 30 minutes".
***
## what are pipes?
pipes are automated workflows that run on your screenpipe data at regular intervals. each pipe is a markdown file with a prompt and a schedule. under the hood, screenpipe runs a coding agent (like [pi](https://github.com/badlogic/pi-mono)) that can query your screen data, call APIs, write files, and take actions.
```mermaid theme={null}
flowchart LR
A["pipe.md"] --> B["schedule"]
B --> C["run queue"]
C --> D["AI agent"]
D --> E["screenpipe API"]
D --> F["connected app proxies"]
D --> G["files, memories, notifications, or external APIs"]
D --> H["logs and session history"]
```
## use chat, MCP, or a pipe?
| job | use |
| -------------------------------------------------------------- | ------------------------------------- |
| ask one question about recent activity | chat |
| give Claude, Codex, Cursor, or another assistant screen memory | [MCP](/mcp-server) |
| run the same workflow every day or hour | pipe |
| write to Obsidian, CRM, Slack, or another app | pipe plus [connections](/connections) |
| build an app or script against screenpipe | [API recipes](/api-recipes) |
**a pipe is just one file: `pipe.md`**
```
~/.screenpipe/pipes/
├── daily-journal/
│ └── pipe.md
├── toggl-sync/
│ ├── pipe.md
│ └── .env # secrets (api keys)
└── obsidian-sync/
└── pipe.md
```
## creating a pipe
create a folder in `~/.screenpipe/pipes/` with a `pipe.md` file:
```bash theme={null}
mkdir -p ~/.screenpipe/pipes/my-pipe
cat > ~/.screenpipe/pipes/my-pipe/pipe.md << 'EOF'
---
schedule: every 30m
enabled: true
---
Summarize my screen activity for the last 30 minutes.
Query screenpipe at http://localhost:3030/search using the time range from the context header.
Authenticate with the SCREENPIPE_LOCAL_API_KEY environment variable.
Write the summary to ./output/.md
EOF
# install + enable + test it from the CLI (no install needed — npx / bunx / bun x all work):
npx -y screenpipe@latest pipe install ~/.screenpipe/pipes/my-pipe
npx -y screenpipe@latest pipe enable my-pipe
npx -y screenpipe@latest pipe run my-pipe # run once now to test
#
# (or use the desktop app: Pipes → My Pipes — or the authenticated REST API)
```
## manage pipes from the CLI
every pipe action is available from the CLI — no separate install. `npx -y screenpipe@latest`, `bunx screenpipe@latest`, and `bun x screenpipe@latest` are equivalent; use whichever the machine has.
```bash theme={null}
npx -y screenpipe@latest pipe list # list all pipes
npx -y screenpipe@latest pipe install # install from a GitHub URL or a local folder
npx -y screenpipe@latest pipe enable # turn the schedule on
npx -y screenpipe@latest pipe disable # turn it off
npx -y screenpipe@latest pipe run # run once now (test before the schedule fires)
npx -y screenpipe@latest pipe logs # view execution logs
npx -y screenpipe@latest pipe delete # remove a pipe
```
run CLI commands from a clean temp directory to avoid `node_modules` conflicts: `cd "$(mktemp -d)" && npx -y screenpipe@latest pipe list`.
this is how you turn a one-off into a recurring **cron** automation: write a `pipe.md` with a `schedule` (e.g. `0 9 * * *`), `install` then `enable` it, and screenpipe runs it on that cron. you can also hand these commands to any AI agent — e.g. *"create a screenpipe pipe that summarizes my day at 6pm"* — and let it scaffold, install, and enable the pipe for you.
## pipe.md format
every pipe.md starts with YAML frontmatter between `---` markers, followed by the prompt:
```markdown theme={null}
---
schedule: every 2h
enabled: true
---
Your prompt goes here. This is what the AI agent will execute.
You can reference screenpipe's API, write files, call external APIs, etc.
```
### frontmatter fields
| field | required | default | description |
| ---------- | -------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `schedule` | yes | `manual` | `every 30m`, `every 2h`, `daily`, cron (`0 */2 * * *`), or `manual` |
| `enabled` | no | `true` | whether the scheduler runs this pipe |
| `timeout` | no | `300` (5 min) | execution timeout in seconds. increase for slow models (e.g., `timeout: 2400` for 40 min). if a pipe runs over this limit, it is terminated. |
### context header
before execution, screenpipe prepends a context header to the prompt:
```
Time range: 2026-02-12T13:00:00Z to 2026-02-12T14:00:00Z
Date: 2026-02-12
Timezone: PST (UTC-08:00)
Pipe name: my-pipe
Output directory: ./output/
Screenpipe API: http://localhost:3030
```
the AI agent uses these values to query the right time range, identify which pipe is running, and format output correctly. no template variables needed — just write plain instructions.
### schedule formats
| format | example | description |
| -------- | ----------------------- | --------------------------------- |
| interval | `every 30m`, `every 2h` | runs at fixed intervals |
| daily | `daily` | runs once per day |
| cron | `0 */2 * * *` | standard 5-field cron expression |
| manual | `manual` | only runs when triggered manually |
### example: pipe with longer timeout for slow models
if your pipe uses a slower AI model or runs complex analysis, increase the timeout:
```markdown theme={null}
---
schedule: daily
enabled: true
timeout: 2400
---
Analyze user activity and generate a detailed report.
Use claude-opus or other capable models for thorough analysis.
Write results to ./output/daily-report.md
```
in this example, the pipe will run daily and has up to 40 minutes to complete. without the `timeout` field, it would be limited to 5 minutes and likely timeout on slower models.
## manage pipes
use the desktop app (**Pipes → My Pipes**) or the REST API:
## http api
when screenpipe is running, pipes are also manageable via the local API:
```bash theme={null}
export SCREENPIPE_LOCAL_API_KEY="$(npx -y screenpipe@latest auth token)"
# list all pipes
curl http://localhost:3030/pipes \
-H "Authorization: Bearer $SCREENPIPE_LOCAL_API_KEY"
# run a pipe
curl -X POST http://localhost:3030/pipes/my-pipe/run \
-H "Authorization: Bearer $SCREENPIPE_LOCAL_API_KEY"
# enable/disable
curl -X POST http://localhost:3030/pipes/my-pipe/enable \
-H "Authorization: Bearer $SCREENPIPE_LOCAL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"enabled": true}'
# update pipe content
curl -X POST http://localhost:3030/pipes/my-pipe/config \
-H "Authorization: Bearer $SCREENPIPE_LOCAL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"raw_content": "---\nschedule: every 1h\nenabled: true\n---\n\nYour prompt here..."}'
# view logs
curl http://localhost:3030/pipes/my-pipe/logs \
-H "Authorization: Bearer $SCREENPIPE_LOCAL_API_KEY"
# install from URL
curl -X POST http://localhost:3030/pipes/install \
-H "Authorization: Bearer $SCREENPIPE_LOCAL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"source": "https://example.com/pipe.md"}'
```
## app ui
go to **Pipes → My Pipes** to see installed pipes, toggle schedules, run them manually, select an AI preset, and view logs.
## examples
### reviewed project time report
```markdown theme={null}
---
schedule: manual
enabled: false
---
Create a draft project time report for the time range in the context header.
1. Authenticate local API requests with SCREENPIPE_LOCAL_API_KEY
2. Use /activity-summary for numeric active-time totals
3. Use bounded /search results to suggest project labels and describe work
4. Put ambiguous blocks in a needs-review section
5. Write the draft to ./output/project-time-report.md
6. Do not send it, create an invoice, or update an external time tracker
```
see [consultant time tracking](/consultant-time-tracking) for the full workflow.
### daily journal (obsidian)
```markdown theme={null}
---
schedule: every 2h
enabled: true
---
Summarize my screen activity into a daily journal entry.
Query screenpipe search API for the time range in the context header.
Write to ~/obsidian-vault/screenpipe/.md
Use [[wiki-links]] for people and projects.
Include timeline deep links: [time](screenpipe://timeline?timestamp=)
```
### standup report
```markdown theme={null}
---
schedule: daily
enabled: true
---
Generate a standup report from yesterday's screen activity.
Format: what I did, what I'm doing, blockers.
Write to ./output/.md
```
## AI presets
in the screenpipe app, go to **Settings → AI settings** to configure presets (model + provider combinations). in **Pipes → My Pipes**, you can assign a preset to each pipe — this overrides the model/provider in the frontmatter.
screenpipe auto-creates a default preset using screenpipe cloud.
## AI providers
by default, pipes use **screenpipe cloud** — no setup needed if you have a screenpipe account.
to use your own AI subscription (Claude Pro, ChatGPT Plus, Gemini, or API keys), pipes reuse [pi's native auth system](https://github.com/badlogic/pi-mono):
### option 1: subscription (free with existing plan)
```bash theme={null}
# run pi interactively and use /login
pi
# then type: /login
# select Claude Pro, ChatGPT Plus, GitHub Copilot, or Google Gemini
```
### option 2: API key
add to `~/.pi/agent/auth.json`:
```json theme={null}
{
"anthropic": { "type": "api_key", "key": "sk-ant-..." },
"openai": { "type": "api_key", "key": "sk-..." },
"google": { "type": "api_key", "key": "..." }
}
```
or set environment variables: `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`.
### using in a pipe
add `provider` to your pipe.md frontmatter:
```yaml theme={null}
---
schedule: every 30m
provider: anthropic
model: claude-haiku-4-5@20251001
---
```
**provider resolution:** preset (if set) → frontmatter provider/model → screenpipe cloud.
## secrets
store API keys in `.env` files inside the pipe folder:
```bash theme={null}
echo "TOGGL_API_KEY=your_key_here" > ~/.screenpipe/pipes/toggl-sync/.env
```
the pipe prompt can reference them: `source .env && curl -u $TOGGL_API_KEY:api_token ...`
**never put secrets in pipe.md** — the prompt may be visible in logs.
## architecture
```
pipe.md (prompt + config)
→ pipe manager (parses frontmatter, schedules runs)
→ agent executor (pi, claude-code, etc.)
→ agent queries screenpipe API + executes actions
→ output saved to pipe folder
```
* **agent ≠ model**: the agent is the CLI tool (pi, claude-code). the model is the LLM (haiku, opus, llama).
* **one pipe runs at a time** (global semaphore prevents overlap)
* **lookback = schedule interval** (capped at 8h to prevent context overflow)
* **logs saved** to `~/.screenpipe/pipes/{name}/logs/` as JSON
## troubleshooting
for a production-style debugging flow, including logs, stuck runs, provider auth, connection proxies, and permissions, see [debug screenpipe pipes](/pipe-debugging).
### pipe scheduled but doesn't run
**problem**: windows task scheduler or cron shows the task running, but the pipe produces no output.
**solution**: the pipe agent needs to know which pipe it's executing. the context header includes `Pipe name: ` so the agent can identify itself. make sure:
1. the pipe folder name matches the expected pipe name (e.g., `~/.screenpipe/pipes/my-pipe/`)
2. the pipe is listed in `npx -y screenpipe@latest pipe list`
3. check logs: `npx -y screenpipe@latest pipe logs my-pipe`
### pipe runs but produces empty output
**problem**: pipe executes successfully but generates no files or notifications.
**solution**: ensure your pipe prompt includes concrete instructions to:
* query screenpipe API with the injected local token and a bounded start time
* write output files (e.g., to `./output/.md`)
* or send notifications (e.g., `POST http://localhost:11435/notify`)
test locally first: `npx -y screenpipe@latest pipe run my-pipe` to see logs before relying on scheduled execution.
### windows task scheduler permission denied
**problem**: windows task scheduler fails with permission errors when running pipes.
**solution**: ensure screenpipe engine is running before the task executes. pipes require the local API at `http://localhost:3030`. schedule the pipe *after* the app starts, or use the desktop UI instead.
## security & permissions
by default, pipes have **full API access** — they can call any screenpipe endpoint. this is fine for pipes you write yourself, but if a pipe doesn't need write access, you can restrict it.
add `permissions` to your frontmatter:
```yaml theme={null}
---
schedule: every 30m
permissions: reader
---
```
### presets
| preset | what it allows |
| -------- | ---------------------------------------------------------------------------------- |
| (none) | **full access** — no restrictions, same as always |
| `reader` | read-only: `/search`, `/activity-summary`, `/meetings` (GET), `/notify`, `/health` |
| `writer` | reader + meeting writes, memory writes |
| `admin` | everything (explicit opt-in, useful for logging) |
### custom rules
use typed patterns for fine-grained control over endpoints and data:
```yaml theme={null}
---
schedule: every 1h
permissions:
allow:
- App(Slack, Chrome)
- Content(accessibility, audio)
deny:
- Api(* /meetings/stop)
- App(1Password)
- Window(*incognito*)
---
```
rule types: `Api(METHOD /path)`, `App(name)`, `Window(glob)`, `Content(type)`. deny always wins.
if your pipe doesn't need to write data, add `permissions: reader` — it prevents accidental side effects like ending a meeting or deleting data.
### protecting api keys & credentials
if you worry that an agent could access API keys or passwords visible on screen, use `.env` files (never put secrets in `pipe.md` itself):
```bash theme={null}
# store secrets safely in .env (not visible to screenpipe or agents)
echo "GITHUB_TOKEN=ghp_..." > ~/.screenpipe/pipes/my-pipe/.env
echo "SLACK_API_KEY=xoxb-..." >> ~/.screenpipe/pipes/my-pipe/.env
```
then reference them in your pipe prompt:
```bash theme={null}
source .env && curl -H "Authorization: Bearer $GITHUB_TOKEN" https://api.github.com/...
```
**why this is safe**: `.env` files live on disk outside screenpipe's recording scope — agents execute shell commands with access to `source .env`, but screenpipe never captures the secrets on screen. credentials are only visible in pipe logs (which you control) and memory, not in screen recordings.
to further restrict what an agent can do, use `permissions: reader` — pipes with read-only access cannot make API calls to external services, only query your screen data.
see the full reference: [pipe permissions →](/pipe-permissions)
## built-in Home shortcuts
screenpipe currently ships four Home shortcuts. these are available without a Store install; community and integration pipes remain under **Pipes → Discover**.
| pipe | what it does | schedule |
| -------------------- | ----------------------------------------------------------- | --------- |
| **Automate My Work** | find a repeated workflow and propose a testable automation | on-demand |
| **Day Recap** | summarize accomplishments, key moments, and unfinished work | on-demand |
| **Time Breakdown** | review app, project, and category activity | on-demand |
| **Missed To-Dos** | find likely unresolved commitments from recent work | on-demand |
need help building pipes? [join our discord](https://discord.gg/screenpipe) — share your pipes, get feedback, and see what others are building.
[download screenpipe →](https://screenpi.pe/onboarding)
# privacy data flow: what screenpipe captures and stores
Source: https://docs.screenpipe.com/privacy-data-flow
What screenpipe captures, where it is stored locally, when data can leave your machine, and the controls that keep screen and audio data private.
screenpipe is local-first. screen, audio, input, browser metadata, meeting transcripts, and connected-app context are stored on your machine unless you explicitly enable a cloud provider, sync/archive path, or external integration.
## data flow
```mermaid theme={null}
flowchart LR
A["screen, audio, input, browser metadata"] --> B["local capture pipeline"]
B --> C["local sqlite and media files"]
C --> D["desktop app timeline and search"]
C --> E["local API on localhost:3030"]
E --> F["MCP tools and pipes"]
F --> G["optional AI provider"]
F --> H["optional connected app proxy"]
C --> I["optional archive or sync"]
```
## what leaves the machine?
| feature | leaves your machine by default? | when data leaves |
| -------------------------- | ------------------------------- | -------------------------------------------------------------------------- |
| screen and audio capture | no | never unless another feature sends selected context |
| local search and timeline | no | local only |
| MCP server | no | local assistant can read data; remote MCP over HTTP is your responsibility |
| chat with local Ollama | no | local only |
| chat with cloud AI | yes | selected context is sent to that AI provider |
| pipes with cloud models | yes | pipe context is sent to the selected model |
| connected app proxy | yes | requests go to the connected third-party API |
| cloud media analysis | yes, if enabled | media snippets can be sent to the configured enclave/provider |
| PII filter enclave | yes, for enclave mode | text is processed in the confidential enclave |
| cloud archive or team sync | yes, if enabled | encrypted data is uploaded to the configured archive or storage target |
| feedback/log bundle | only when you send it | diagnostic logs you submit for support |
## local storage
| data | default location |
| --------------- | -------------------------------------------------------------------- |
| screenpipe data | `~/.screenpipe/` |
| recorded media | `~/.screenpipe/data/` |
| connections | secure store first, legacy `~/.screenpipe/connections.json` fallback |
| app settings | app store plus local config files |
| e2e test data | isolated `.e2e/` directory in the app repo |
### changing your storage location
you can move screenpipe data to a different drive or external storage:
1. **quit screenpipe completely** — ensure the app is not running
2. **copy `~/.screenpipe/` to your new location** — e.g., `/Volumes/MyDrive/.screenpipe/`
3. **set the environment variable** `SCREENPIPE_DATA_DIR=/Volumes/MyDrive/.screenpipe` before starting screenpipe
4. **restart screenpipe** — the app will now use the new location
**note:** if pipes still read or write to the default location after changing settings, ensure:
* screenpipe itself (the main app) was fully restarted after the change
* any CLI or scheduled processes use the same `SCREENPIPE_DATA_DIR` value
* if using the desktop app, the settings change is saved and the app was restarted
**for cloud backup or team sync:** use **settings → storage → archive** or **cloud archive** instead of manually moving the directory. this ensures pipes and search continue to work correctly.
## privacy controls
| control | where |
| ----------------------------------- | ----------------------------------- |
| pause or stop capture | app controls and settings |
| included/excluded windows | settings -> recording |
| microphone and system audio | settings -> recording |
| clipboard capture | settings -> recording or CLI flag |
| API auth | settings -> privacy -> API security |
| LAN access | settings -> privacy |
| cloud media analysis | settings -> privacy |
| AI PII removal | settings -> privacy |
| retention mode (media / lean / all) | settings -> storage or data APIs |
| delete range and compact database | settings -> storage or data APIs |
| archive / download my archive | settings -> storage |
| team sharing | settings -> team |
## PII removal modes
| mode | what happens |
| ---------------------- | ------------------------------------------------------------------------------------ |
| text redaction at rest | detected PII is redacted in stored text columns on-device, not only at AI-query time |
| local text model | text is redacted locally before selected AI workflows use it |
| local image model | screenshots can be redacted locally when image PII is enabled |
| enclave mode | text is sent to a confidential enclave designed not to persist data |
| cloud media toggle off | cloud audio, video, and image analysis is blocked |
the safest setup is local capture, local search, local Ollama, and cloud media analysis off. the most capable setup can include cloud AI, connected apps, archive, sync, and team sharing.
## browser session inheritance
the embedded agent browser can optionally inherit login state from supported real browsers. this is opt-in and uses one-time Keychain consent per browser source.
use it when:
* an agent browser needs authenticated pages
* you want screenpipe to avoid repeated manual sign-in
* you trust the local machine and the agent task
turn it off or decline the prompt when:
* the page contains financial, health, or sensitive personal data
* you do not want agent workflows to access logged-in sessions
* you are on a shared device
## agent and pipe security
local agents and pipes can access your screenpipe data—screen text, OCR, accessibility tree, and transcripts. they cannot steal keyboard input or files, but they can see API keys, passwords, and secrets visible on screen.
secure your setup:
* **exclude sensitive windows** — add your password manager, banking site, or cloud console to **settings → recording → ignored windows**. agents won't see data from ignored apps.
* **use connection proxies** — instead of pasting API keys into prompts, create a screenpipe connection so tokens are managed securely.
* **trust only official pipes** — use pipes from the [official pipe store](https://screenpi.pe/pipe-store) or audit custom pipes before installing.
* **scope tasks narrowly** — a pipe searching only "the last meeting" is lower-risk than one searching "all screen text."
* **review logs** — use `screenpipe pipe logs ` to see what data a pipe accessed.
if uncomfortable with agents accessing your screen data, disable the embedded agent browser and use CLI or API only.
## teams and admins
team sharing is encrypted client-side. the server stores membership and encrypted blobs, but not the team encryption key. invite links contain the key, so share them through a trusted channel and treat them as sensitive.
admins should document:
* whether cloud AI is allowed
* which models and presets employees can use
* which integrations are approved
* retention policy
* whether LAN API access is allowed
* how support logs are collected
## irreversible actions
before deleting data:
1. confirm the time range or device ID.
2. export or archive anything needed.
3. run the delete action.
4. verify the timeline and `/search` no longer return that range.
## related pages
* [privacy filter](/privacy-filter)
* [teams](/teams)
* [cloud archive](/cloud-archive)
* [API recipes](/api-recipes)
# privacy filter - strip personal info before AI sees it
Source: https://docs.screenpipe.com/privacy-filter
Strip names, emails, phone numbers, addresses, and secrets from screenpipe data before AI sees it, using local redaction or a confidential enclave.
the privacy filter removes personal info from your screen data before the AI you're chatting with sees it. names, emails, phone numbers, addresses, account numbers, and secrets are replaced with placeholders like `[PERSON]`, `[EMAIL]`, `[PHONE]`, or `[SECRET]`.
for the full local/cloud data-flow model, see [privacy data flow](/privacy-data-flow).
## redaction is on by default
you don't have to switch anything on: screenpipe redacts the values you type into form fields — passwords, card numbers, secrets — locally, before they're ever stored or sent. each redaction is labeled in plain language so you can see what was scrubbed.
want to see exactly what screenpipe reads? hover a capture setting and it highlights the regions of the screen it looks at.
## choose a privacy mode
| mode | best for | what happens |
| ------------------------ | ---------------------------------------------------------- | --------------------------------------------------------------------------------- |
| local text redaction | keeping text processing on-device | a local PII model redacts text before selected AI workflows use it |
| local image redaction | protecting screenshots before image workflows | a local image model redacts visual secrets when image PII is enabled |
| confidential enclave | high-accuracy redaction without trusting a normal cloud VM | text is sent to an attested Tinfoil enclave with no disk and no request-body logs |
| cloud media analysis off | strict local-only media handling | cloud audio, video, and image analysis calls are blocked |
the shield in chat uses the configured privacy filter path for AI searches. local modes keep processing on your machine; enclave mode processes inside confidential compute.
## how enclave mode works
in the chat composer, click the shield icon above the send button. the toggle is saved between sessions.
when the AI asks for screen data (accessibility text, OCR fallback text, audio transcripts, etc.), screenpipe-server on your computer sends selected text to the privacy filter enclave.
a token-classification model reads the text and replaces personal info with tagged placeholders. the enclave has no disk, no logs, and encrypted memory — nothing persists past the request.
the filtered text comes back with names/emails/etc replaced. that's what reaches your AI chat — the AI never sees your personal info.
## what gets removed
people names in any context — "Louis", "Mr. Beaumont", "louis.b\@..."
email addresses in any format
phone numbers including international formats
physical addresses and postal codes
SSNs, credit card numbers, bank accounts, IDs
API keys and tokens that look like secrets
URLs that look personal
dates that look personal (birthdates etc)
example:
```
Before: "email louis@screenpi.pe about the invoice, call me at 555-1234"
After: "email [EMAIL] about the invoice, call me at [PHONE]"
```
## why not just a regex
most "PII scrubbers" are pattern matches: find anything with an `@` + a domain, replace it. that catches obvious stuff and misses everything else — names with no context, addresses with no zip code, account numbers formatted oddly, dates.
our filter uses [`openai/privacy-filter`](https://huggingface.co/openai/privacy-filter), a 1.5B-parameter token-classification model fine-tuned specifically for this. it reads the whole sentence and decides, token by token, what is and isn't personal.
## why it's confidential
we run the filter inside a **confidential-compute enclave** hosted by [Tinfoil](https://tinfoil.sh). confidential compute uses CPU features (AMD SEV-SNP / Intel TDX) to encrypt the virtual machine's memory at the hardware level. even the cloud provider running the physical hardware can't read the memory.
what that gives you:
the enclave publishes a signed hash of the container image it's running. you (or your client) can fetch the hash and check it against [the open-source code](https://github.com/screenpipe/privacy-filter). if the hashes don't match, the enclave is compromised and the client refuses to talk to it.
the enclave has no persistent storage. nothing written during a request survives past the request — by design, not policy.
the [server code](https://github.com/screenpipe/privacy-filter/blob/main/server.py) doesn't log request bodies. anyone can audit it.
HTTPS from your machine to the enclave. TLS termination happens inside the attested boundary, so the decrypted text only exists in enclave memory.
## who sees what
* **you**: you flip the toggle, you see the original data on your own screen.
* **screenpipe-server (local)**: sends raw text to the enclave, gets redacted text back. runs on your computer.
* **the enclave**: decrypts the text, runs the model, returns the redacted version. destroys the memory immediately.
* **screenpipe cloud**: *not in the path.* our backend can't see the raw text — we built it this way deliberately.
* **the AI (claude, gpt, gemini, your local llama, whichever)**: only ever sees the redacted version.
in local mode, the enclave is not in the path: redaction happens on your machine before selected context reaches the AI workflow.
## where it applies
toggle the shield icon in the chat composer. the app adds `filter_pii=1` to every search the AI runs on your screen data. persists across sessions.
set `privacy_filter: true` in a pipe's front-matter (`pipe.md`). the pipe agent's screen searches get the flag automatically.
append `?filter_pii=1` to any `/search` request against your local screenpipe-server (`http://localhost:3030/search?q=foo&filter_pii=1`).
## limits
* **latency.** adds \~1-2 seconds per search on first hit. responses are cached by content hash for 1 hour so repeated data (same email thread, same IDE file) is nearly free.
* **model imperfection.** >99% on common categories in our tests, but not perfect. don't rely on it as your only line of defense for critical secrets — combine with the "ignored windows" filter and don't record password managers.
* **text and images.** the enclave filter operates on text already extracted from the accessibility tree or OCR fallback. separately, a local image-redaction model can redact screenshots on-device when image PII removal is enabled. raw image frames aren't uploaded to the enclave. if you enable cloud archive that uploads frames, those are separate and encrypted end-to-end by your own key.
* **available on paid plans.** the shield icon is available on paid plans. compute inside a confidential enclave isn't free. users on the free plan see the shield with an upgrade link.
* **fail closed.** if the enclave is unreachable, your search call fails with a clear error rather than silently returning unredacted text. you never get redaction that didn't happen.
## open source
all three layers are auditable:
* **filter service, Dockerfile, Tinfoil config:** [github.com/screenpipe/privacy-filter](https://github.com/screenpipe/privacy-filter)
* **client integration in screenpipe-server:** [crates/screenpipe-engine/src/privacy\_filter.rs](https://github.com/screenpipe/screenpipe/blob/main/crates/screenpipe-engine/src/privacy_filter.rs)
* **Tinfoil attestation SDK** for independently verifying the running enclave: [docs.tinfoil.sh](https://docs.tinfoil.sh)
if you find a way to make the filter leak data, [please tell us](mailto:louis@screenpi.pe) — we take this one seriously.
# screenpipe quickstart: install and connect AI in 5 minutes
Source: https://docs.screenpipe.com/quickstart
Go from install to your first AI-powered insight in under 5 minutes — set up screenpipe, connect your AI assistant, and run your first automation pipe.
you're 5 minutes away from having AI that knows everything on your screen. here's the fastest path to value.
## choose your path
| i want... | start here | success looks like |
| ---------------------------------------------------- | ----------------------------------------------------------------------- | ---------------------------------------------------------------- |
| AI memory in Claude, Codex, Cursor, or another agent | follow the MCP connection step below | your AI can answer "what did I do in the last 5 minutes?" |
| local search and API access | install, record for a few minutes, then try [API recipes](/api-recipes) | `/search` returns recent screen or audio results |
| recurring automations | install your first pipe, then read [pipe debugging](/pipe-debugging) | the pipe runs manually, logs clearly, and writes a useful output |
ask what you were working on after a few minutes of recording
create a private draft of accomplishments and unfinished work
install a Store pipe or describe a custom automation
verify that the expected screen and audio periods were captured
## the 5-minute setup
[download the desktop app](https://screenpi.pe/onboarding) — works on macOS, Windows, and Linux.
open it, grant screen recording and microphone permissions when prompted, and screenpipe starts capturing automatically.
on macOS, you'll need to allow screen recording and accessibility access in System Settings → Privacy & Security.
browse some websites. write some code. check slack. screenpipe is now capturing everything — app text primarily via accessibility APIs, OCR fallback when needed, and audio via transcription.
you can verify it's working:
```bash theme={null}
curl http://localhost:3030/health
```
`/health` does not need a token. when **Require API Authentication** is enabled, retrieve the token with `npx -y screenpipe@latest auth token` and add a bearer header to protected requests.
pick your AI tool and connect screenpipe to it.
the fastest way is one command — it installs the screenpipe skills and registers the MCP server:
```bash theme={null}
npx -y screenpipe@latest agent setup
```
where `` is one of `openclaw`, `hermes`, `claude-code`, `claude-desktop`, `codex`, `cursor`, or `windsurf`. or wire it up manually:
**Claude Desktop (recommended)**
open screenpipe → go to **settings** (gear icon, bottom of sidebar) → **connections** (under Data & Privacy) → click **"install extension"** next to Claude. done.
**Claude Code**
```bash theme={null}
claude mcp add screenpipe --transport stdio --scope user -- npx -y screenpipe-mcp
```
**Codex**
open screenpipe → go to **settings** → **connections** → click **connect** next to Codex. then open a new Codex session.
**Cursor**
[click here to install in cursor](cursor://anysphere.cursor-deeplink/mcp/install?name=screenpipe\&config=eyJ0eXBlIjoic3RkaW8iLCJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsInNjcmVlbnBpcGUtbWNwIl19)
**ChatGPT**
in the screenpipe chat (Home), click the model selector next to the input → select **ChatGPT** → sign in with your OpenAI account.
go to your AI tool and try:
* *"what was I working on in the last 5 minutes?"*
* *"summarize what I just read in the browser"*
* *"what apps have I been using?"*
that's it. your AI now has memory of your screen.
pipes are AI automations that run on a schedule. click **Pipes** in the sidebar to open the pipe store.
browse **Pipes → Discover** — try installing **Digital Clone** or **Obsidian Daily Summary**. click **GET**; the app switches to **My Pipes**, where you can review and run it. **Day Recap** is already available as a built-in Home shortcut.
popular first pipes:
| pipe | what it does |
| -------------------------- | --------------------------------------------- |
| **Digital Clone** | builds a persistent AI memory of who you are |
| **Obsidian Daily Summary** | writes daily summaries to your Obsidian vault |
| **Focus Assistant** | notifies you when you're distracted |
| **Todo List Assistant** | tracks tasks and reminds you of what's due |
[browse all pipes →](/pipe-store)
## what you can do now
find code snippets, conversations, documents — anything that was on your screen
ready-made automations — CRM sync, meeting intelligence, time tracking, and more
add screenpipe to Codex, Cursor, Cline, Continue, Gemini CLI, and more
dozens of integrations — Slack, Notion, Google Calendar, Obsidian, Toggl, HubSpot, and more
## common first questions
**"what are pipes?"**
pipes are scheduled AI agents that run on your screen data. think of them as automations — a pipe can build your digital memory, track your time, sync notes to Obsidian, or anything you can describe in a prompt. browse them in the sidebar under **Pipes**. [learn more →](/pipes)
**"is my data private?"**
yes. everything is captured and stored locally by default. no data leaves your machine unless you explicitly choose a cloud provider, connected app, archive/sync flow, or remote AI workflow. see [privacy data flow](/privacy-data-flow).
**"can I use my own AI subscription?"**
yes. you can use your ChatGPT Plus, Claude Pro, or any API key. you can also use local models via Ollama for complete privacy. [learn more →](/chatgpt)
**"what does screenpipe capture?"**
screen text (primarily via accessibility APIs, with OCR fallback), audio transcriptions, app names, window titles, browser URLs, and user input events. you control what's captured in **settings → recording**.
**"how do I connect my apps?"**
go to **settings → connections** (under Data & Privacy). screenpipe supports dozens of integrations including Slack, Notion, Google Calendar, Google Docs, Obsidian, Toggl, HubSpot, Salesforce, PostHog, Sentry, Zoom, and more. [learn more →](/connections)
**"how do I know it worked?"**
open **Home**, ask a question in your AI tool, or run `curl http://localhost:3030/health`. after a few minutes of recording, `/search` and [API recipes](/api-recipes) should return real activity.
need help? [join our discord](https://discord.gg/screenpipe) — 10k+ members.
# relationship context and follow-up
Source: https://docs.screenpipe.com/relationship-follow-up
Create a private, reviewed follow-up queue from meetings and on-screen conversations without automatically messaging people or inventing commitments.
use this workflow to remember who you spoke with, what was actually agreed, and where a reply may be needed. it works best as a private preparation tool, not an autonomous personal CRM.
```mermaid theme={null}
flowchart TD
A["meetings and approved conversations"] --> B["verified commitments"]
B --> C["prioritized follow-up queue"]
C --> D["reviewed message drafts"]
D --> E["manual send or CRM update"]
```
## step by step
Decide which work accounts, apps, and people are in scope. exclude personal messaging, sensitive relationships, legal or health discussions, and any source you are not permitted to process.
Start with the last day or week. a smaller window makes it easier to verify whether a request was answered later.
Search by person, company, meeting, app, or topic. use transcript and visible message context only when it belongs to the relationship workflow.
Extract requests, promises, stated dates, unanswered questions, and “waiting on” items. do not turn a suggestion or viewed task into a commitment.
Search after each candidate item for a reply, delivery, cancellation, or changed owner. keep items as uncertain when the final state is outside the captured sources.
Rank by stated deadline, customer impact, and relationship importance. retain source app and time so each item can be checked quickly.
Create short drafts with no new promises. review recipient, tone, attachments, and private context before sending or updating a CRM.
## queue prompt
```markdown theme={null}
Build a private relationship follow-up queue from this bounded screenpipe data.
For each item include:
- person or organization
- explicit request or commitment
- stated owner and date, if present
- latest observed status
- source app or meeting and time range
- confidence: verified, needs confirmation, or unknown
- a short draft reply that adds no new promise
Search for later resolution before calling an item open.
Do not infer relationship health, sentiment, or intent.
Do not send messages or update a CRM.
```
for a single call, start with [meeting follow-up](/meeting-follow-up). for structured sales fields, use [meeting to CRM](/meeting-to-crm).
# turn browser research into a checked brief
Source: https://docs.screenpipe.com/research-brief
Recover pages, documents, and questions from a bounded research session, then create a concise brief that preserves sources and uncertainty.
screenpipe is useful when research sprawls across browser tabs, PDFs, notes, chats, and calls. it can recover what you viewed and how ideas connected. it cannot prove that every claim on a viewed page is true or still current.
```mermaid theme={null}
flowchart TD
A["research question"] --> B["bounded pages and notes"]
B --> C["claims linked to original sources"]
C --> D["fact and freshness check"]
D --> E["reviewed brief"]
```
## step by step
Start with a question such as “which three vendors meet these requirements?” define the audience, deadline, and evidence standard before searching.
Record the approximate start and end. use a separate browser profile or window when you need a clean boundary from unrelated browsing.
Search the window by `browser_url`, app name, document title, and key terms. collect the original URL or file title for every source that may support a material claim.
For each candidate claim, record what was observed, its source, when it was viewed, and whether the source directly supports it. keep notes and AI inferences separate.
Reopen primary sources for prices, product capabilities, laws, schedules, people, and other facts that may have changed. a screen recording proves what you saw, not that the page is current.
Summarize the answer, options, tradeoffs, recommendation, contrary evidence, and unknowns. link each important claim to its original source.
Store the brief locally or in the approved project repository. omit private messages and credentials that appeared during the research session.
## useful API searches
```bash theme={null}
export SCREENPIPE_API_KEY="$(npx -y screenpipe@latest auth token)"
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" \
"http://localhost:3030/search?browser_url=github.com&start_time=3h+ago&end_time=now&limit=50"
curl -H "Authorization: Bearer $SCREENPIPE_API_KEY" \
"http://localhost:3030/search?q=vendor-or-topic&content_type=all&start_time=3h+ago&end_time=now&limit=50"
```
## brief prompt
```markdown theme={null}
Create a research brief from these bounded screenpipe results.
Include:
- decision question and scope
- candidate answer
- source table: claim, original URL or document, observed time, support level
- options and tradeoffs
- contrary evidence and unknowns
- facts that require a current primary-source check
- recommendation, clearly labeled as analysis
Do not treat a viewed page as verified truth.
Do not invent missing URLs or source details.
Exclude unrelated private activity.
```
do not publish a brief containing current external claims until you have reopened and checked the original sources.
# search your screen history
Source: https://docs.screenpipe.com/search-screen-history
Find any text, conversation, or activity from your screen history with screenpipe's local AI-powered search on Mac, Windows, and Linux.
screenpipe records your screen 24/7 and lets you search through everything. find that code snippet, conversation, or document you saw last week.
for copy-paste API workflows beyond search, see [API recipes](/api-recipes).
## how it works
1. **event-driven capture** — screenpipe captures when meaningful UI activity happens, with idle fallback captures
2. **accessibility-first text extraction** — app text comes from the OS accessibility tree when available; OCR is the fallback for visual-only surfaces like games, remote desktops, or legacy frames
3. **local storage** — everything stored in a local SQLite database
4. **search API** — query via `localhost:3030/search` with filters
## search examples
### find by text
```bash theme={null}
curl "http://localhost:3030/search?q=project+apollo+budget&content_type=all&limit=20"
```
### find by app
```bash theme={null}
curl "http://localhost:3030/search?app_name=Code&content_type=accessibility&limit=20"
```
### find by time range
```bash theme={null}
curl "http://localhost:3030/search?q=standup&start_time=2026-02-10T14:00:00Z&end_time=2026-02-10T18:00:00Z"
```
### find by browser URL
```bash theme={null}
curl "http://localhost:3030/search?browser_url=github.com&limit=10"
```
### combine filters
```bash theme={null}
curl "http://localhost:3030/search?q=deployment&app_name=Slack&content_type=all&limit=10"
```
## search parameters
| param | type | description |
| -------------------- | -------- | --------------------------------------------------------------------------------------------------------- |
| `q` | string | search query |
| `limit` | int | max results (default 20) |
| `offset` | int | pagination offset |
| `content_type` | string | `ocr`, `audio`, `accessibility`, `input`, `all` |
| `start_time` | ISO 8601 | filter by start time |
| `end_time` | ISO 8601 | filter by end time |
| `app_name` | string | filter by app name |
| `window_name` | string | filter by window title |
| `browser_url` | string | filter by browser URL |
| `min_length` | int | minimum text length |
| `max_length` | int | maximum text length |
| `max_content_length` | int | truncate each result's text to this many chars (middle-truncation); `0` returns the full text untruncated |
| `frame_id` | int | restrict results to a single captured frame |
| `include_related` | bool | also return content carrying co-occurring tags |
## using the desktop app
the easiest way to search is the built-in search in the screenpipe desktop app:
1. open screenpipe
2. use the search bar or timeline view
3. scroll through your day visually
4. select content to chat with AI about it
### chat mentions — filter what AI sees
in the chat input box, type `@` to add mentions that filter what content the AI analyzes:
| mention | shows | use case |
| -------------------------------------------------- | ----------------------------------------------------------------------------------- | --------------------------------- |
| `@screen` | what was visible on screen (accessibility text, OCR fallback text, and screenshots) | "summarize my code changes" |
| `@audio` | voice & meeting transcriptions | "what was said about the budget?" |
| `@input` | clicks, keystrokes, app switches | "what apps did I use today?" |
| `@today`, `@yesterday`, `@last-hour`, `@last-week` | time ranges | "changes this morning" |
| `@app-name` | content from specific apps | "messages in Slack" |
combine mentions: `@audio @last-hour` shows only voice data from the past hour. removing a mention: click the `×` on its pill or delete it from the text.
## search tips
* **be specific**: "slack message from john about deployment" > "deployment"
* **use time context**: combine `start_time` and `end_time` for precision
* **combine filters**: app name + time range + keywords
## thumbnails show "unavailable"?
if frame thumbnails in the search results or timeline show as "unavailable", it's likely because **API authentication is enabled** and the app doesn't have your API key.
**in the desktop app**: this is handled automatically. no action needed.
**via API (CLI, external tools, remote instances)**: when `--api-auth` is enabled (the default for security), thumbnail requests require an `Authorization` header:
```bash theme={null}
# get your API key
API_KEY=$(npx -y screenpipe@latest auth token)
# now thumbnails load with the key
curl "http://localhost:3030/frames?id=12345" \
-H "Authorization: Bearer $API_KEY"
```
if you're accessing screenpipe from another device on your network (with `--listen-on-lan`), always include the auth header in image requests to prevent 403 errors.
## AI chat vs. search API — when to use each
the desktop app offers two ways to find content:
**search API & timeline** — best for precision location:
* use the search bar with keywords + filters (app name, time range, browser URL)
* scroll the timeline visually
* perfect for "find that exact blog post I saw 30 minutes ago"
* faster and more reliable for recent, specific content
**AI chat** — best for understanding & synthesis:
* ask natural language questions about what you've done
* AI reads the screenshots and text to answer conceptually
* great for "what was I working on this morning?" or "summarize today's meetings"
* less precise for pinpointing one specific piece of content, especially if the data isn't in the AI's active context window
**if AI chat can't find content you know exists:**
1. use the search API instead — try filtering by app name and time range first
2. add context: mention the app (Chrome, VS Code, Slack) and approximate time
3. use the timeline to visually locate the content, then ask chat about it
4. if still missing, check that the app or window isn't in your ignored-windows list
## accessing the API from other devices on your network
by default, the screenpipe API only listens on `127.0.0.1` (localhost). to access it from other devices on your LAN, start screenpipe with the `--listen-on-lan` flag:
```bash theme={null}
npx -y screenpipe@latest --listen-on-lan
```
this binds the server to `0.0.0.0`, making it reachable at `http://:3030/`. note that `--listen-on-lan` automatically enables API authentication to protect your data on the network.
**example:** if your machine's local IP is `192.168.1.100`, you can now query from another device:
```bash theme={null}
curl "http://192.168.1.100:3030/search?q=my+query" \
-H "Authorization: Bearer "
```
to find your machine's local IP:
* **macOS/Linux**: `ifconfig | grep "inet " | grep -v 127.0.0.1`
* **Windows**: `ipconfig | find "IPv4"`
## privacy
* all search happens locally on your device
* no data leaves your machine unless you choose a cloud AI, cloud transcription, connected app, archive/sync, or remote workflow
* control what's recorded with `--ignored-windows` and `--included-windows`
* see [privacy data flow](/privacy-data-flow) for the full model
questions? [join our discord](https://discord.gg/screenpipe).
## get screenpipe
screenpipe includes 24/7 screen recording, AI search, and more.
[download screenpipe →](https://screenpi.pe/onboarding)
# build a second brain in your agent
Source: https://docs.screenpipe.com/second-brain
Turn any agent — OpenClaw, Hermes, Claude, or Codex — into a second brain that watches your screenpipe activity and remembers your workflows.
a lot of people connect screenpipe to a personal AI agent — [OpenClaw](/openclaw), Hermes, [Claude Code](/claude-code), [Codex](/opencode), Cursor — and then only ever use it to *ask questions on demand* ("what was I reading yesterday?").
the bigger win is to let your agent build a **second brain** about you in the background: it watches what you do through screenpipe, splits your day into distinct workflows, writes higher-level summaries of your processes, and keeps a durable memory of who you are and what you're working on — so you never have to re-explain your context again.
this is the same idea as the [digital clone pipe](/pipe-store) (which builds a persistent AI memory of you inside the screenpipe app), but it lives inside *your own* agent's memory. you set it up by pasting one prompt.
this works with any agent that can run a tool/shell and run on a schedule. it does not require the screenpipe app's pipes — your agent does the work.
## 1. connect screenpipe first
your agent needs to be able to read your activity. the fastest way is the screenpipe MCP server — add it to your agent's MCP config:
```json theme={null}
{
"mcpServers": {
"screenpipe": {
"command": "npx",
"args": ["-y", "screenpipe-mcp"]
}
}
}
```
this gives your agent the `search-content`, `activity-summary`, `list-meetings`, and `update-memory` tools.
* running your agent on a **VPS or a different machine** than screenpipe (common with OpenClaw / Hermes)? see [OpenClaw → different machines](/openclaw#different-machines) for querying over Tailscale or pushing your `~/.screenpipe` data with `npx -y screenpipe@latest sync remote`. the same steps work for Hermes and any other agent.
* not using MCP? your agent can hit the local REST API directly at `http://localhost:3030` — see [MCP server setup](/mcp-server) and [api recipes](/api-recipes).
it also helps to load the [screenpipe skills](https://github.com/screenpipe/screenpipe/tree/main/.claude/skills) (or the equivalent for your agent) so it navigates the data efficiently.
## 2. paste this into your agent
copy this prompt into OpenClaw, Hermes, Claude, Codex, Cursor, or any agent connected to screenpipe:
```text build my second brain theme={null}
you have access to screenpipe, a local tool that records everything i see, say, and
hear on my computer and makes it searchable. i want you to build and maintain a
"second brain" about me — a living memory of who i am, what i'm working on, and how
i work — by watching my activity through screenpipe in the background, so i never
have to re-explain my context. think of it as a digital clone of my working context.
## how to read my activity
if you have the screenpipe MCP tools (search-content, activity-summary, list-meetings,
update-memory), use them. otherwise query the local REST API at http://localhost:3030
(or http://SCREENPIPE_IP:3030 if i run screenpipe on another machine):
- recent activity: curl "http://localhost:3030/search?content_type=all&start_time=START&end_time=END&limit=100"
- light summary: curl "http://localhost:3030/activity-summary?start_time=START&end_time=END"
- meetings: curl "http://localhost:3030/meetings?limit=20"
START / END are ISO 8601 UTC timestamps. start with a small window (the last 1-2 hours)
so you don't pull too much. if screenpipe skills are available, load them first.
## what to do each run (about once an hour, or when i ask)
1. SEGMENT — pull my activity since you last ran and split it into distinct work
sessions. a session is a coherent block of related activity (e.g. "45 min in cursor
refactoring auth", "30 min reviewing investor follow-ups", "1h call about X").
note the app(s), the time range, what i was actually trying to do, and the goal.
2. SUMMARIZE — for each session write a short summary of the *process*: the steps i
took, the tools/inputs/outputs, the decisions i made, and whether it's repeatable.
if it looks repeatable, capture it as a numbered SOP i could hand off or automate.
3. REMEMBER — update my second brain with anything durable and reusable:
- who i am: role, goals, preferences, recurring tools
- people i interact with and about what (tag person:NAME)
- projects in flight, their status, open loops (tag project:NAME)
- workflows / SOPs i repeat (tag topic:NAME)
store only stable, reusable facts. never store secrets — passwords, API keys, tokens,
financial or health data, or anything clearly private. skip one-off noise.
## where to store the second brain
- if you have the screenpipe update-memory tool: write each durable fact as a memory
with namespaced tags (person:, project:, topic:) and importance 0-1. retrieve later
with search-content content_type='memory'. this is the same memory the screenpipe
digital-clone pipe builds, so it stays queryable from any agent.
- also (or instead, if you lack that tool) keep markdown files i can read:
second-brain/profile.md - who i am, goals, preferences
second-brain/people/NAME.md - one file per person
second-brain/projects/NAME.md - one file per project, with open loops
second-brain/workflows/NAME.md - repeatable SOPs
second-brain/log/DATE.md - the hourly session summaries (append-only)
second-brain/now.md - what i'm doing right now and over the last
~30/120 min, refreshed every run
always APPEND and DEDUPE: update existing entries instead of duplicating them, and
link related notes together.
## run on a schedule
set this to run automatically about once an hour using whatever scheduling you have
(claude tasks, codex automations, openclaw/hermes automations, a system cron job, or a
screenpipe pipe — `npx -y screenpipe@latest pipe install ` then `... pipe enable `).
between runs, when i ask you anything, read now.md and the relevant project/person
files first so you already know what i was doing.
start now: do one pass over my last 2 hours, then tell me what you learned about me
and propose the schedule.
```
## what it builds
after a few runs you'll have a self-maintaining memory of yourself:
| file / memory | what's in it |
| ------------------- | --------------------------------------------------------------------------------------------------------------- |
| `now.md` | what you're doing right now and over the last \~30/120 min — so the agent never asks "what are you working on?" |
| `log/DATE.md` | hourly session summaries — your day, segmented into workflows |
| `projects/*.md` | each project, its status, and open loops |
| `people/*.md` | who you talk to and about what |
| `workflows/*.md` | repeatable processes captured as SOPs you can hand off or automate |
| screenpipe memories | the same durable facts, tagged and queryable from any agent via `search-content content_type='memory'` |
## run it on a schedule
the prompt above tells the agent to schedule itself, but you control the cadence with whatever your agent supports:
* **OpenClaw / Hermes** — their built-in automations / scheduled tasks
* **Claude Code** — claude tasks
* **Codex** — codex automations
* **screenpipe pipe** — run it inside screenpipe itself: save the prompt to `~/.screenpipe/pipes/second-brain/pipe.md` with a `schedule` (e.g. `0 * * * *`), then `npx -y screenpipe@latest pipe install ~/.screenpipe/pipes/second-brain && npx -y screenpipe@latest pipe enable second-brain` (`bunx` / `bun x` work too — see [pipes](/pipes))
* **anything else** — a plain `cron` / `launchd` / `systemd` timer that re-runs the prompt
hourly is a good default. lighter machines can run every few hours; use `activity-summary` first to keep token usage low.
## privacy
screenpipe data is local. the agent only sees what you let it reach (MCP on `localhost`, your REST API, or the `~/.screenpipe` data you sync). the prompt explicitly tells the agent **not** to store secrets or private data in your second brain. if your agent runs on a remote VPS, also follow the clipboard note in [OpenClaw → different machines](/openclaw#different-machines) so passwords and keys that pass through your clipboard aren't synced off-device.
## next steps
* [OpenClaw integration](/openclaw) — connect on the same machine or over a VPS
* [give AI memory of your screen](/ai-memory) — the memory layer, explained
* [pipes](/pipes) — run the same kind of automation *inside* the screenpipe app instead of your agent
* [digital clone pipe](/pipe-store) — the one-click version of this
* [join our discord](https://discord.gg/screenpipe) — share your second-brain setup
# capture a workflow as an SOP
Source: https://docs.screenpipe.com/team-sop-capture
Record one clean run of a real workflow with screenpipe, then draft a reviewed team SOP with prerequisites, decisions, exceptions, and evidence gaps.
an SOP built from real activity is more useful than a generic checklist, but recorded activity is not automatically the correct process. capture a clean run, draft the document, and have the person who owns the work approve it.
## define “done” first
before recording, write down:
* the trigger
* required inputs and permissions
* the accepted result
* the process owner and reviewer
* sensitive information that must be excluded
* common exceptions worth capturing separately
## step by step
The process owner completes the task normally while screenpipe records the relevant screen and, if helpful, narration. pause when unrelated sensitive work appears.
Record the start and end. include a short statement of the trigger and result so the AI does not have to infer them from UI fragments.
Ask for prerequisites, numbered actions, decisions, exceptions, validation, rollback, and unresolved gaps. refer to UI labels rather than unstable screen coordinates.
Remove accidental detours, add missing policy, and identify steps that reflected personal habit rather than an organizational requirement.
Have a teammate follow the draft without coaching. capture where they hesitate or cannot verify success.
Add an owner, review date, version, and change history. keep raw recording access narrower than the final SOP.
After the SOP works, use [workflow discovery](/workflow-discovery) to choose one stable step for automation.
```mermaid theme={null}
flowchart TD
A["accepted result"] --> B["one clean run"]
B --> C["AI draft"]
C --> D["owner review"]
D --> E["teammate test"]
E --> F["approved SOP"]
F --> G["small automation candidate"]
```
## SOP prompt
```markdown theme={null}
Create a draft SOP from this bounded screenpipe record.
Include:
- purpose, trigger, prerequisites, and accepted result
- numbered steps with app and visible UI label
- decision points and approval boundaries
- common exceptions observed in the data
- how to validate success
- safe rollback or escalation
- evidence gaps requiring owner input
- owner, review date, and version placeholders
Do not include passwords, tokens, customer data, or private message text.
Do not treat accidental detours as required steps.
Mark every inferred step as needing review.
```
## SOP or automation?
document first when the process contains policy, judgment, exceptions, or approvals. automate only the stable portion whose output can be checked. a reliable checklist is a valid result; not every workflow needs a bot.
team administrators can standardize filters and pipe configuration with [teams](/teams), but each participant still needs a clear recording policy and appropriate access.
# teams — share configs with end-to-end encryption
Source: https://docs.screenpipe.com/teams
Push pipe configurations and content filters to your team. Everything is encrypted client-side — the server only sees encrypted blobs.
teams let admins push pipe configurations and recording filters to all members. everything is end-to-end encrypted using AES-256-GCM — the screenpipe server never sees your configs in plaintext.
## what you can share
share scheduled AI agents (pipe.md configs) with your team so everyone runs the same automations
push ignored/included window lists so the whole team has consistent privacy rules
share ignored URL patterns (e.g. banking sites) to enforce org-wide recording policies
publish approved model presets, lock the default, and control whether employees can add custom presets
## how security works
teams use **AES-256-GCM** encryption. the encryption key is generated on the admin's device and never sent to our server. members receive the key through the invite link (shared out-of-band via a secure channel like slack DM or signal).
a 256-bit AES-GCM key is generated locally using the Web Crypto API. this key is stored in the Tauri secure store (`~/.screenpipe/store.bin`) — not in localStorage or anywhere web-accessible.
the invite link contains the team ID and the base64-encoded encryption key: `screenpipe://join-team?team_id=...&key=...`. this is the only time the key is transmitted — via the link itself, not through our server.
when a member opens the invite link, the key is imported and stored in their local Tauri secure store. our server only records the membership — it never sees the key.
when an admin pushes a pipe or filter config, it's encrypted locally with AES-256-GCM using a random 12-byte nonce. only the encrypted blob and nonce are sent to the server.
team members download the encrypted configs and decrypt them on-device using the shared key. decrypted configs are applied to local settings automatically.
## what the server stores vs what it can see
| data | stored on server | readable by server |
| ----------------------- | :--------------: | :--------------------------------------------------: |
| team name & member list | yes | yes |
| encrypted config blobs | yes | **no** |
| encryption nonces | yes | yes (but useless without key) |
| encryption key | **no** | **no** |
| decrypted pipe configs | **no** | **no** |
| decrypted filter lists | **no** | **no** |
| managed preset policy | yes | depends on policy metadata; model secrets stay local |
## managed AI presets
admins can standardize which AI models employees use for chat and pipes.
common policies:
| policy | when to use it |
| ---------------------- | ------------------------------------------------------------------ |
| locked default | every employee should use the same approved model |
| allowed custom presets | power users can add providers while the team default stays managed |
| no custom presets | regulated teams need approved models only |
| budget-aware presets | expensive models are reserved for specific workflows |
managed presets are especially useful when paired with [privacy data flow](/privacy-data-flow): document which models can receive screen context, which integrations are approved, and whether cloud media analysis is allowed.
## getting started
### create a team (admin)
1. go to **settings > team**
2. enter a team name and click **create team**
3. copy the invite link and share it with your team via a secure channel
the invite link contains your encryption key. share it only through a secure channel (e.g. signal, slack DM, in-person). anyone with this link can join and decrypt your team's configs.
### join a team (member)
1. open the invite link — screenpipe will handle it automatically via deep link
2. alternatively, go to **settings > team** and paste the invite link manually
### push filters to team (admin)
1. go to **settings > recording** and scroll to **filtering**
2. set up your ignored windows, included windows, or ignored URLs
3. click the **push to team** button on any filter card
pushed filters appear under the **team** tab and are automatically synced to all members.
### share a pipe to team (admin)
1. go to **settings > pipes**
2. click the **share** button next to any pipe
3. the pipe config (including its prompt and schedule) is encrypted and pushed to the team
if you update a pipe locally and share it again, the team copy is overwritten with your latest version. the model is last-push-wins — there's no merge.
### how filters sync for members
when a member visits the team tab, shared filters are automatically merged into their local recording settings:
* **team filters are additive** — they're combined with the member's own filters, not replaced
* **team-sourced entries show a badge** in the recording settings so members know which filters come from the team
* **members can't remove team filters** from their local settings while they're in the team — leaving the team clears them
## roles
| action | admin | member |
| ----------------------------- | :---: | :----: |
| create/delete team | yes | no |
| invite members | yes | no |
| remove members | yes | no |
| push configs (pipes, filters) | yes | no |
| delete shared configs | yes | no |
| receive shared configs | yes | yes |
| leave team | yes | yes |
## requirements
* screenpipe account (sign in at **settings > team**)
* screenpipe desktop app (teams use the Tauri secure store for key storage)
## technical details
* **encryption**: AES-256-GCM via the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto)
* **key storage**: Tauri plugin-store (`~/.screenpipe/store.bin`), not localStorage
* **nonce**: 12-byte random per encryption operation (crypto.getRandomValues)
* **config types**: `pipe`, `window_filter`, `url_filter` (extensible)
* **sync**: automatic when the team tab loads; filter configs merge into local settings via the `useTeamSync` hook
audit the AES-256-GCM encryption implementation
## faq
**what happens if i lose the invite link?**
the admin can always copy it again from **settings > team**. the encryption key is stored locally on the admin's device.
**can the screenpipe team read my configs?**
no. the server only stores encrypted blobs. the encryption key is never transmitted to our server.
**what if two admins push the same pipe name?**
last push wins. the newer version overwrites the older one. there's no merge or conflict resolution — the pipe is treated as a single document.
**what happens when i leave a team?**
all team-sourced filters are removed from your local settings. your personal filters remain unchanged.
**is the encryption key rotated?**
not currently. if you suspect the key is compromised, delete the team and create a new one with a fresh key.
**what if a member receives a server-emailed invite without the key?**
server emails cannot include the client-side encryption key. the admin must share the full invite link from the desktop app through a trusted channel.
questions? [join our discord](https://discord.gg/screenpipe).
# troubleshoot screenpipe: install, permissions, and pipes
Source: https://docs.screenpipe.com/troubleshooting
Fix common screenpipe issues including installation errors, screen and microphone permissions, missing audio, pipe failures, and MCP connection problems.
## start here
| symptom | first check | deeper guide |
| ---------------------------------------------- | -------------------------------------------------------- | --------------------------------------------- |
| app says free after purchase | sign out/in with purchase email | [FAQ](/faq) |
| cannot find receipt | account billing area and purchase email | [FAQ](/faq) |
| desktop timeline missing after CLI install | install desktop app, not only CLI | [getting started](/getting-started) |
| app opens but data is empty | `curl http://localhost:3030/health` and wait 1-2 minutes | [API recipes](/api-recipes) |
| AI tool cannot see screenpipe | MCP config, Node 18+, app running | [MCP server](/mcp-server) |
| pipe fails or hangs | pipe logs, provider auth, permissions | [pipe debugging](/pipe-debugging) |
| Windows command window flashes during pipe run | pipe exits immediately; check logs | [pipe debugging](/pipe-debugging) |
| meeting transcript is empty | microphone, system audio, transcription engine | [meeting intelligence](/meeting-intelligence) |
| `/api/search` returns 404 | use `/search` on `localhost:3030` | [API recipes](/api-recipes) |
| privacy question | local/cloud path and enabled toggles | [privacy data flow](/privacy-data-flow) |
| connected app fails | OAuth callback, token, proxy path | [connection reference](/connection-reference) |
## installation & startup
### installed the CLI but cannot find the timeline
`npx -y screenpipe@latest record` starts local recording and the API. it does not give you the desktop timeline UI by itself.
if you want the visual timeline, pipe store, settings, chat, and guided permissions, install the desktop app from [screenpi.pe/onboarding](https://screenpi.pe/onboarding).
after installing the desktop app:
1. open screenpipe.
2. grant screen recording and accessibility permissions.
3. wait 1-2 minutes.
4. verify data with `curl "http://localhost:3030/search?limit=5&content_type=all"`.
### screenpipe won't start
**macOS:**
* grant screen recording permission: System Settings → Privacy & Security → Screen Recording → enable screenpipe
* grant accessibility permission: System Settings → Privacy & Security → Accessibility → enable screenpipe
* if you see "app is damaged", right-click the app → Open (bypasses Gatekeeper on first launch)
**Windows:**
* run as administrator on first launch
* if Windows Defender blocks it, click "More info" → "Run anyway"
* ensure .NET runtime is installed (screenpipe installer usually handles this)
* if the embedded browser or timeline is blank, install or repair Microsoft Edge WebView2 Runtime and restart screenpipe
**Linux:**
* install dependencies: `sudo apt install tesseract-ocr libxcb1`
* grant screen capture permissions for your display server (X11 or Wayland)
### login loop, failed to load user, or wrong account
try this before reinstalling:
1. quit screenpipe completely.
2. reopen the app and sign out if possible.
3. sign back in with the same email used for purchase or trial setup.
4. make sure your default browser can open the login callback.
5. temporarily disable VPN/proxy if the callback never returns.
if the app still says free after purchase, include the purchase email and the currently signed-in email when contacting support.
### screenpipe is running but not capturing
check the health endpoint:
```bash theme={null}
curl http://localhost:3030/health
```
if it returns an error:
* make sure screen recording permission is granted
* restart the app
* check if another instance is already running on port 3030
if health returns OK but search returns no results:
* wait 1-2 minutes — screenpipe needs time to capture and process frames
* check that your display is listed in settings → monitors
* verify screen text search is working: `curl "http://localhost:3030/search?limit=1&content_type=all"`
* try `content_type=accessibility` and `content_type=all` before narrowing to OCR-only searches
* check included/ignored windows filters so you are not excluding the app you are testing
***
## API and timeline confusion
### `/api/search` returns 404
the local screenpipe endpoint is:
```bash theme={null}
curl "http://localhost:3030/search?limit=5"
```
not `/api/search`.
common checks:
* `curl http://localhost:3030/health`
* `curl "http://localhost:3030/search?limit=5&content_type=all"`
* `curl "http://localhost:3030/search?limit=5&content_type=accessibility"`
* `curl "http://localhost:3030/search?limit=5&content_type=audio"`
use [API recipes](/api-recipes) for copy-paste examples.
### search only finds old results
if recent results are missing:
1. confirm recording is still active in settings.
2. check whether the app/window is ignored.
3. search without `start_time`, `end_time`, `app_name`, or `window_name` filters first.
4. if a pipe uses a schedule, remember it may only search its schedule window.
5. restart screenpipe if the UI is stale but the API is healthy.
### can I capture only work hours?
use app recording filters when you want to include or exclude specific apps, windows, or URLs. for strict work-hour logic, create a pipe that checks the current time and exits outside your desired window, or configure recording/schedule settings when that control is available in the app.
## audio & transcription
### no audio being captured
* check **settings → recording** — make sure at least one device is selected
* on macOS: grant microphone permission in System Settings → Privacy & Security → Microphone
* verify audio is being recorded: `curl "http://localhost:3030/search?content_type=audio&limit=1"`
### windows microphones record silence or near-silence
on Windows 11 24H2, some USB and communications-class microphones can expose formats that look valid but produce unusably quiet audio. if transcripts are empty or audio is around silent:
1. switch the input to the Windows system default microphone.
2. unplug phantom devices such as dock stubs or controller adapters.
3. test another USB port or direct connection instead of a dock.
4. restart screenpipe and run `curl "http://localhost:3030/search?content_type=audio&limit=1"`.
5. include the exact device name when reporting the issue.
### audio drops out during calls or long meetings
if you notice gaps in transcription or missing audio segments, the transcription queue is likely full and screenpipe is dropping segments to prevent the system from freezing.
**causes:**
* transcription can't keep up with the incoming audio (especially with large batch sizes or slower hardware)
* multiple audio devices selected simultaneously
* transcription engine is overloaded (too many complex tasks running)
**fixes (in order of effectiveness):**
1. **reduce batch size:** settings → recording → audio chunk duration — try lowering from default (30-40s) to 10-15s. smaller batches process faster and drop less audio
2. **switch to faster transcription:** settings → AI models → try `whisper-tiny` or `whisper-base` instead of `whisper-large-v3-turbo` (trades accuracy for speed)
3. **disable unused audio devices:** settings → recording → uncheck devices you don't need — recording one device instead of multiple reduces queue pressure
4. **use cloud transcription:** switch to **deepgram** or **screenpipe-cloud** for remote processing, which doesn't block your local system
5. **reduce system load:** close heavy apps or run screenpipe on a machine with better CPU/RAM
if the issue persists, check the app logs for “dropping audio segment” warnings.
### bluetooth headphone audio quality drops
this is a macOS limitation, not a screenpipe bug. when any app opens a bluetooth microphone, macOS switches from A2DP (high quality) to HFP (phone quality).
**fix:** go to **settings → recording** → switch input to your MacBook's built-in microphone. screenpipe still captures your voice, and your bluetooth audio quality stays high.
note: AirPods don't have this issue — Apple uses a proprietary codec.
### transcription is inaccurate
* switch to a better engine: **settings → AI models** → `whisper-large-v3-turbo` (most accurate)
* set your language explicitly in settings (auto-detect is slower and less accurate)
* reduce background noise
* use a better microphone
* try `deepgram` or `screenpipe-cloud` for cloud-based transcription (highest accuracy)
### record only specific apps (e.g. Teams, Zoom)
if you want to record only certain applications (like Teams meetings) and exclude everything else:
1. **screen capture**: go to **settings → recording → included windows** and add the app name (e.g., `Teams`, `Zoom`). screenpipe will only capture these windows, even if you switch away briefly
2. **audio devices**: go to **settings → recording** and select only the devices you need — for example, just your microphone and system audio, deselecting other inputs
3. **test it**: open Teams and verify the timeline shows only Teams content. try opening other apps — they shouldn't appear in the recording
this is useful for compliance, privacy (avoid recording unrelated work), or reducing storage usage. your recorded meetings and transcriptions are searchable via the API as normal.
note: with included windows, screenpipe pauses capture when the app loses focus. this is intentional — if you want to capture even when focused on another window, use the broader "all windows" setting instead.
***
## chat & AI interactions
### chat hangs or stops responding
if your chat window freezes, try these fixes in order:
1. **restart screenpipe** — closes stalled message queues
2. **check health:** `curl http://localhost:3030/health` — if it fails, backend is stuck
3. **verify you have data** — screenpipe needs screen/audio history; wait 1-2 minutes after startup
4. **verify AI provider connection** — settings → model selector. for ChatGPT/Claude, sign out/back in
5. **reduce load** — disable unused pipes under **Pipes → My Pipes**, switch to a faster, lighter model in your configured provider, and check logs for “timeout” errors
### chat messages disappear
if assistant replies vanish when navigating away, **update to the latest version** — this message persistence bug was fixed. if you are behind, reinstall screenpipe to get the latest version.
### AI model connection fails
1. verify subscription active: [openai.com](https://openai.com) (ChatGPT Plus/Pro) or [claude.ai](https://claude.ai) (Claude Pro)
2. sign out/in: settings → model selector → sign out, restart, sign back in
3. if still failing, your tokens expired — try again
***
## pipes
### Windows command window opens and closes when a pipe runs
this usually means the pipe started and crashed immediately.
1. open **Pipes → My Pipes**.
2. select the pipe and open logs.
3. run the pipe manually.
4. check that `pipe.md` exists in the pipe folder and has valid frontmatter.
5. if the pipe calls a script, run that script from PowerShell so the error stays visible.
6. verify the local API with `curl http://localhost:3030/health`.
include the log output when asking for help. "the command window flashes" is the symptom; the useful error is usually in the pipe log or the script output.
### pipe runs but produces no output
1. check logs: go to **Pipes → My Pipes** → open your pipe → view logs
2. make sure your prompt includes concrete instructions to write output or send notifications
3. test manually: click "run" in the pipe UI and watch the logs in real-time
4. verify screenpipe has data to work with: `curl "http://localhost:3030/search?limit=5"`
5. confirm the prompt says what to do when no data is found, so the pipe does not silently guess
### pipe doesn't run on schedule
* make sure the pipe is enabled under **Pipes → My Pipes**
* check that the schedule format is correct: `every 30m`, `every 2h`, `daily`, or a cron expression
* only one pipe runs at a time — if another pipe is running, yours will wait in the queue
* start with manual run; only debug the schedule after manual run works
### pipe fails with AI errors
* check your AI provider is configured: settings → AI settings
* if using screenpipe cloud: make sure you're signed in
* if using your own API key: verify it's valid and has credits
* if using ChatGPT/Claude subscription: try signing out and back in to refresh tokens
* check the pipe logs for the specific error message
### pipe can't find screen data
* make sure screenpipe is actively recording (check health endpoint)
* the pipe only searches within its schedule interval — if schedule is "every 30m", it only looks at the last 30 minutes
* verify data exists for the time range: `curl "http://localhost:3030/search?start_time=30m+ago&limit=5"`
* search with `content_type=all` before narrowing to `accessibility`, `ocr`, or `audio`
* remove `window_name` filters until you confirm the exact window title stored by screenpipe
### pipe notifications, sounds, or Telegram messages do not fire
debug the pipeline in pieces:
1. confirm the pipe starts.
2. confirm screenpipe search returns the condition you expect.
3. test the notification or Telegram/API call outside the pipe.
4. reconnect the integration if tokens expired.
5. make the prompt write a log line when it decides not to notify.
***
## MCP & AI connections
### MCP not connecting to Claude/Cursor
1. verify screenpipe is running: `curl http://localhost:3030/health`
2. restart Claude Desktop / Cursor after adding the MCP config
3. test the MCP server directly: `npx @modelcontextprotocol/inspector npx -y screenpipe-mcp`
4. check that Node.js >= 18 is installed: `node --version`
### Claude/Cursor says "no results" when asking about screen
* make sure screenpipe has been running long enough to capture data
* try a broader query: "what apps have I been using?" instead of very specific text
* check that screen recording permissions are granted
### ChatGPT connection not working
* sign out and sign back in (settings → model selector → sign out)
* make sure your ChatGPT subscription is active
* try restarting the screenpipe app
***
## performance
### screenpipe using too much CPU
* reduce capture FPS: settings → capture rate (default 1 FPS is usually fine)
* exclude heavy apps from capture: settings → recording → ignored windows
* on older machines, use `whisper-tiny` instead of `whisper-large-v3-turbo`
### screenpipe using too much disk space
* screenpipe uses \~30 GB/month at 1 FPS — this is normal
* reduce capture rate in settings
* data is stored in `~/.screenpipe/data/` — you can delete old recordings
* use cloud archive to offload and restore older data ([learn more →](/cloud-archive))
### can I store data on a NAS or external drive?
you can back up `~/.screenpipe/` to external storage. be careful with active database and media writes on slow or unreliable network drives; they can make the app feel broken or risk corruption.
for active long-term retention, prefer [cloud archive](/cloud-archive) or a stable local disk plus backup. if you do use a NAS, test recording, search, restart, and recovery before relying on it.
### screenpipe using too much RAM
* typical usage is \~600 MB RAM
* if it's using significantly more, restart the app
* close the timeline view if you're not using it (it loads video frames)
* local PII models can use several GB while active, then unload after idle time. see [privacy data flow](/privacy-data-flow).
**multi-monitor setups**: screenpipe captures all monitors simultaneously. with 2-3+ displays, memory usage can double or triple because each monitor frame is processed independently.
**fixes for multi-monitor setups:**
1. reduce capture rate: settings → capture rate → try 0.5 FPS instead of 1 FPS. this is the most effective optimization for multi-monitor systems
2. close the timeline view when not actively using it — it buffers video frames from all monitors in memory
3. if you only need one display: in the UI, disable or hide unused monitors in the settings → recording section
4. monitor your actual usage: `curl http://localhost:3030/vision/list` shows active monitors. each additional monitor increases baseline memory by 50-200 MB depending on resolution
### timeline or owned browser is blank on Windows
1. install or repair Microsoft Edge WebView2 Runtime.
2. close screenpipe completely and reopen it.
3. check whether other WebView2 apps on the machine render.
4. if this only happens after sleep/wake, restart screenpipe and include logs in the report.
### engine is still starting
some buttons disable themselves while the local engine is cold. wait for:
```bash theme={null}
curl http://localhost:3030/health
```
then retry sync, pipe run, search, or MCP setup.
***
## privacy & PII
### how is personal data protected?
screenpipe redacts the values you type into form fields — passwords, card numbers, secrets — on-device by default, before data is stored or sent. detected PII is also redacted in stored text columns at rest, not only at AI-query time. on top of that default, you have these options:
| feature | what it does | where |
| ------------------------------ | ------------------------------------------------------------------------------ | ---------------------------------------- |
| form-field redaction (default) | masks passwords, card numbers, and secrets on-device before storing or sending | on by default |
| local AI PII removal | redacts sensitive data before selected AI workflows see it | settings → privacy → AI PII removal |
| privacy filter (enclave mode) | uses a confidential enclave to redact text for cloud AI | settings → privacy → privacy filter mode |
| ignored windows | prevents screenpipe from recording specific apps (password managers, banking) | settings → recording → ignored windows |
the safest setup: keep the defaults on, enable **AI PII removal**, ignore your password manager window, and use local Ollama or disabled cloud media.
### enable local PII redaction
1. go to **settings → privacy**.
2. toggle **AI PII removal** on.
3. choose a redaction policy: default is `credentials-only` (catches API keys, tokens, SSNs, credit cards). you can also choose `strict` to redact names, emails, and phone numbers.
4. for image protection: toggle **image PII removal** separately if you want screenshots redacted before image workflows.
5. restart screenpipe if you changed settings.
the local model runs on your machine — no data leaves your computer. the first run may be slow as the model loads; subsequent searches are faster.
### what does PII redaction remove?
* **credentials-only mode** (default): API keys (OpenAI, Anthropic, Stripe, etc.), SSNs, credit card numbers, tokens, private keys, database connection strings with passwords
* **strict mode**: all of above plus names, emails, phone numbers, IP addresses, URLs with credentials
it does NOT redact:
* general text (even if it sounds like it might be sensitive)
* partial matches (e.g., an email-like pattern without valid formatting)
* structured data in code or config files that isn't in a recognized credential format
### what redaction is automatic vs. optional
form-field values (passwords, card numbers, secrets) are redacted on-device by default, before data is stored or sent, and detected PII is redacted in stored text columns at rest.
the broader **AI PII removal** and **privacy filter (enclave mode)** options are toggles you enable in settings — turn these on for extra coverage of names, emails, phone numbers, and other categories across AI workflows. image PII removal for screenshots is also a separate toggle.
***
## still stuck?
1. check the [FAQ](/faq) for quick answers
2. search [GitHub issues](https://github.com/screenpipe/screenpipe/issues) — someone may have hit the same problem
3. [join our Discord](https://discord.gg/screenpipe) — 10k+ members who can help debug
when asking for help, include:
* your OS and version
* screenpipe version (shown in settings)
* output of `curl http://localhost:3030/health`
* whether API auth and LAN access are enabled
* microphone/audio device name, if audio is involved
* relevant pipe logs or error messages
# what can you do with screenpipe?
Source: https://docs.screenpipe.com/use-cases
Twelve practical, step-by-step workflows for time tracking, client reporting, research, meetings, follow-up, support, SOPs, and local AI memory.
screenpipe records screen and audio while it is running, then makes that local history available to AI. start with one useful output, verify the source data, and expand only after you trust it.
## for consultants and customer work
reconstruct reviewed work blocks and active-time totals without automatic billing
combine work, deliverables, decisions, risks, and next steps into one update
verify the transcript, then draft decisions and action items
extract reviewed deal fields without auto-writing guesses into the CRM
## for focused individual work
remember accomplishments, blockers, and open loops
recover sources you viewed and build a checked research summary
prepare a private follow-up queue from meetings and messages
maintain a small, reviewed context file across agent sessions
## for operations and engineering
find one repeated workflow worth improving
turn one clean process run into a tested operating guide
build a fact, inference, and unknown timeline from a bounded window
watch an approved app, window, or website and report a clear no-data state
## the safe workflow
```mermaid theme={null}
flowchart TD
A["1. choose one result"] --> B["2. set privacy and time boundaries"]
B --> C["3. verify captured source data"]
C --> D["4. generate a local draft"]
D --> E["5. review before sharing or acting"]
```
Decide which apps, windows, websites, people, and hours belong in the workflow. add exclusions before recording client, employee, financial, health, or personal information.
Complete a short test, then search for something you can see or hear. a blank result is a capture problem or a no-data state—not permission for the AI to guess.
Use a current Home shortcut, install a pipe from **Pipes → Discover**, or describe a custom automation under **Pipes → My Pipes → create your own pipe**. run it manually before adding a schedule.
Check time totals, names, decisions, and source moments. keep uncertain items marked as uncertain.
Schedule local drafts after several good manual runs. require review before sending messages, editing a CRM, billing a client, or changing another system.
## rules that keep outputs trustworthy
* use `/activity-summary` for active-time totals; do not infer hours by counting frames, OCR rows, or search results
* give broad `/search` requests a time boundary
* distinguish **no matching data** from **the activity did not happen**
* keep source apps, meetings, URLs, or time ranges when a report may be reviewed later
* treat AI project labels, workflow names, and suggested next steps as suggestions
* verify current external facts from their original source before publishing a research brief
* review any external side effect before it happens
protected local API endpoints require a bearer token when API authentication is enabled. retrieve it with `npx -y screenpipe@latest auth token` or from **Settings → Privacy → API security**, then follow [API recipes](/api-recipes).
## start small
for personal use, begin with [daily work review](/daily-work-review). for a customer or team pilot, use one person, one workflow, one to two weeks, and one agreed output. this makes privacy, accuracy, and value easier to evaluate before expanding.
# screenpipe vs Fathom: 24/7 screen memory vs meeting bot
Source: https://docs.screenpipe.com/vs-fathom
Compare screenpipe and Fathom: 24/7 local screen plus audio capture vs cloud meeting transcription for Zoom, Meet, and Teams — features, pricing, and privacy.
screenpipe captures your entire screen and audio 24/7, locally. Fathom is a cloud-based meeting transcription tool for Zoom, Google Meet, and Teams — meetings only, no screen capture, per-user pricing.
## comparison
| feature | screenpipe | fathom |
| ------------------- | ----------------------------------------------------- | -------------------------------------- |
| **scope** | 24/7 screen + audio | meeting audio only (Zoom, Meet, Teams) |
| **screen capture** | all monitors, all apps | none |
| **data storage** | 100% local | cloud (Fathom's servers) |
| **source access** | source-available, auditable | no (proprietary) |
| **works offline** | yes | no |
| **AI model** | any (Claude, GPT, Ollama, local) | Fathom's built-in AI only |
| **CRM integration** | via custom pipes | native Salesforce + HubSpot |
| **price** | see [current pricing](https://screenpi.pe/onboarding) | per-user subscription |
## why screenpipe?
### captures your full workday
Fathom records scheduled video calls on three platforms. screenpipe captures everything — meetings, Slack, code reviews, emails, browsing, research — 24/7, automatically.
### screen content alongside audio
when someone shares a dashboard and references specific numbers, screenpipe captures both the words and what's on screen. Fathom only gets the audio — slides, URLs in chat, and shared documents are missed.
### no bot joining your calls
Fathom joins meetings as a visible participant on some platforms. hosts can block it, and attendees may feel uncomfortable. screenpipe captures on your device — no bot, no notification to others.
### local-first, auditable, extensible
all data stays on your device. source-available with 17k+ GitHub stars. 45+ app integrations and 16+ pipes in the store. full REST API and MCP server for custom automations.
## get started
[download the desktop app](https://screenpi.pe)
***
## more comparisons
* [screenpipe vs Fathom (full comparison)](https://screenpi.pe/blog/screenpipe-vs-fathom-2026) - in-depth analysis
* [screenpipe vs Fireflies](https://screenpi.pe/blog/screenpipe-vs-fireflies-2026) - cloud meeting bot comparison
* [screenpipe vs Otter.ai](https://screenpi.pe/blog/screenpipe-vs-otter-ai-2026) - cloud transcription comparison
* [all comparisons](https://screenpi.pe/compare) - see how screenpipe stacks up
## frequently asked questions
### is screenpipe a good alternative to Fathom?
yes. screenpipe captures everything Fathom does (meeting audio and transcription) plus your entire screen activity 24/7. it runs locally and the source is auditable. the trade-off: Fathom has native CRM sync (Salesforce, HubSpot), while screenpipe handles CRM workflows through custom pipes and API integrations.
### does screenpipe work for sales teams?
yes. screenpipe captures full meeting transcripts and screen content (shared slides, pricing docs, demo screens) without a bot joining the call. you can build custom CRM sync pipes and use the REST API to push data to Salesforce or HubSpot. for teams where privacy matters, screenpipe keeps all call data local.
### how does Fathom pricing compare to screenpipe?
Fathom is a per-user meeting-transcription subscription. screenpipe pricing changes by plan and use case, so use the [current pricing page](https://screenpi.pe/onboarding) as the source of truth. compare them on scope too: screenpipe covers screen, audio, meetings, local storage, pipes, and API access, not just meeting transcription.
# screenpipe vs Fireflies.ai: local memory vs meeting bot
Source: https://docs.screenpipe.com/vs-fireflies
Compare screenpipe and Fireflies.ai: local 24/7 screen and audio capture vs a cloud meeting bot with per-seat pricing and AI credit caps.
screenpipe captures your entire screen and audio 24/7, locally. Fireflies.ai sends a visible bot to your meetings, transcribes the audio in the cloud, and charges per seat with AI credit limits.
## comparison
| feature | screenpipe | fireflies.ai |
| -------------------- | ----------------------------------------------------- | ----------------------------------- |
| **scope** | 24/7 screen + audio | meeting audio only |
| **screen capture** | all monitors, all apps | none |
| **data storage** | 100% local | cloud (AWS/GCP, US-based) |
| **source access** | source-available, auditable | no (proprietary) |
| **meeting presence** | invisible (captures on your device) | visible bot ("Fireflies Notetaker") |
| **AI limits** | unlimited (choose your model) | credit-capped per plan |
| **works offline** | yes | no |
| **price** | see [current pricing](https://screenpi.pe/onboarding) | per-seat subscription |
## why screenpipe?
### no bot, no friction
Fireflies sends a bot called "Fireflies Notetaker" that joins as a visible participant. hosts can block it, attendees notice it. screenpipe captures audio and screen content on your device — nobody else knows.
### no AI credit caps
Fireflies gates advanced AI features behind credit limits — even on paid plans. the Pro plan gets 20 AI credits per seat, with extra packs costing $5–$600/month. screenpipe lets you use any AI model (Claude, GPT, Ollama, local) with no artificial limits.
### captures more than meetings
Fireflies records scheduled calls. screenpipe captures your entire workday — meetings, Slack, code reviews, emails, research, browsing — 24/7, automatically. meetings are 10–20% of knowledge work; screenpipe covers 100%.
### local-first, auditable, extensible
all data stays on your device. source-available with 17k+ GitHub stars. 45+ app integrations and 16+ pipes in the store. full REST API and MCP server for custom workflows. Fireflies has 90+ integrations but requires cloud processing for all of them.
## get started
[download the desktop app](https://screenpi.pe)
***
## more comparisons
* [screenpipe vs Fireflies (full comparison)](https://screenpi.pe/blog/screenpipe-vs-fireflies-2026) - in-depth analysis
* [screenpipe vs Fathom](https://screenpi.pe/blog/screenpipe-vs-fathom-2026) - meeting tool comparison
* [screenpipe vs Otter.ai](https://screenpi.pe/blog/screenpipe-vs-otter-ai-2026) - cloud transcription comparison
* [all comparisons](https://screenpi.pe/compare) - see how screenpipe stacks up
## frequently asked questions
### is screenpipe better than Fireflies.ai for privacy?
yes. screenpipe processes everything on your device — data never touches an external server. the code is source-available and auditable. Fireflies processes everything in their cloud (AWS/GCP). they hold SOC 2 Type II but the code is closed. for regulated industries (healthcare, finance, legal), screenpipe's local-first approach is often a compliance requirement.
### does screenpipe have CRM integrations like Fireflies?
screenpipe handles CRM sync through custom pipes rather than native connectors. you can build pipes to push meeting data to Salesforce, HubSpot, or any CRM via the REST API. Fireflies has native connectors for Salesforce, HubSpot, and Copper — if zero-config CRM sync is your top priority, Fireflies is more turnkey for that specific workflow.
### how does Fireflies pricing compare to screenpipe?
Fireflies is a per-seat meeting-transcription subscription with AI credit limits. screenpipe pricing changes by plan and use case, so use the [current pricing page](https://screenpi.pe/onboarding) as the source of truth. compare them on scope too: screenpipe covers screen, audio, meetings, local storage, pipes, and API access.
# screenpipe vs Granola - full screen memory vs meeting notes
Source: https://docs.screenpipe.com/vs-granola
Compare screenpipe and Granola: local 24/7 screen plus audio capture vs a cloud AI meeting notepad — features, pricing, and Google Workspace requirements.
screenpipe captures your entire screen and audio 24/7, locally. Granola is an AI meeting notepad that enhances your rough notes with audio transcripts — meetings only, cloud-dependent, requires Google Workspace.
## comparison
| feature | screenpipe | granola |
| ----------------------------- | ----------------------------------------------------- | -------------- |
| **scope** | 24/7 screen + audio | meetings only |
| **screen capture** | all monitors, accessibility-first text + OCR fallback | none |
| **data storage** | 100% local | cloud-based |
| **source access** | source-available, auditable | no |
| **platforms** | macOS, Windows, Linux | macOS, Windows |
| **works offline** | yes | no |
| **requires Google Workspace** | no | yes |
| **price** | see [current pricing](https://screenpi.pe/onboarding) | subscription |
## why screenpipe?
### captures everything, not just meetings
meetings are \~20% of knowledge work. Granola covers that slice. screenpipe captures the other 80% — Slack, code reviews, research, emails, browsing — plus meetings.
### local-first, no cloud dependency
all data stays on your device. no third-party servers, no cloud processing. your security team can audit the local capture and storage code.
### no vendor lock-in
screenpipe works with any email provider, any calendar, any meeting tool. no Google Workspace requirement. choose your own AI model — Claude, GPT, Ollama, or local models.
### extensible platform
45+ app integrations and 16+ pipes in the store. full REST API and MCP server for building custom workflows on top of your captured data.
## get started
[download the desktop app](https://screenpi.pe)
***
## more comparisons
* [screenpipe vs Granola (full comparison)](https://screenpipe.com/compare/granola) - in-depth analysis
* [screenpipe vs Otter.ai](https://screenpi.pe/blog/screenpipe-vs-otter-ai-2026) - cloud transcription comparison
* [screenpipe vs Fathom](https://screenpi.pe/blog/screenpipe-vs-fathom-2026) - meeting tool comparison
* [all comparisons](https://screenpi.pe/compare) - see how screenpipe stacks up
## frequently asked questions
### is screenpipe a good alternative to Granola?
yes. screenpipe captures everything Granola does (meeting audio and transcription) plus your entire screen activity 24/7. it runs locally, is source-available and auditable, and doesn't require Google Workspace. while Granola enhances your manual notes with AI, screenpipe captures everything automatically — no note-taking required.
### does screenpipe capture screen content during meetings?
yes. unlike Granola (audio-only), screenpipe captures everything shown on screen — shared slides, spreadsheets, URLs in chat, documents — alongside the full audio transcript. when someone says "look at row 14," screenpipe has both the words and the actual screen content.
### how does screenpipe pricing compare to Granola?
screenpipe plan details change over time, so use the [current pricing page](https://screenpi.pe/onboarding) as the source of truth. the durable difference is scope: Granola is meeting notes, while screenpipe captures your screen, audio, apps, pipes, MCP tools, and connections across the workday.
# screenpipe vs Limitless - self-hosted alternative
Source: https://docs.screenpipe.com/vs-limitless
Compare screenpipe and Limitless.ai: a self-hosted, source-available desktop screen recorder vs the Limitless AI pendant. Data ownership and privacy compared.
Limitless.ai offers an AI-powered pendant and app for recording meetings and conversations. screenpipe provides similar AI memory capabilities but entirely self-hosted with auditable source.
## comparison
| feature | screenpipe | limitless |
| ------------------ | --------------------------- | ---------------- |
| **hardware** | uses your existing devices | requires pendant |
| **source access** | source-available, auditable | no |
| **data location** | 100% local | cloud-based |
| **platforms** | macOS, Windows, Linux | iOS, web |
| **screen capture** | yes | no |
| **audio capture** | yes | yes |
| **self-hosted** | yes | no |
## why choose screenpipe?
### no hardware purchase
use your existing computer, microphone, and webcam. no additional hardware required.
### screen + audio
limitless only captures audio. screenpipe captures:
* screen content through accessibility APIs, with OCR fallback
* audio transcription
* UI elements (experimental)
### complete privacy
* all data stays on your device
* use local AI models (Ollama)
* no cloud dependency
* audit the source code yourself
### no cloud dependency
screenpipe runs entirely on your device. no cloud account required.
### extensible
build custom integrations with the REST API or [pipes](/pipes):
```bash theme={null}
# query your screen data
curl "http://localhost:3030/search?content_type=all&limit=50"
```
## for meeting transcription
screenpipe handles meetings just as well — configure audio devices in the desktop app settings to capture system audio (meeting apps) and your microphone simultaneously.
## self-hosting benefits
| limitless cloud | screenpipe local |
| --------------------- | ------------------- |
| data on their servers | data on your device |
| internet required | works offline |
| cloud dependency | works offline |
| vendor lock-in | export anytime |
## get started
[download the desktop app](https://screenpi.pe)
***
## more comparisons
* [vs Rewind](/vs-rewind) — local-first alternative
* [vs Microsoft Recall](/vs-recall) — privacy-focused alternative
* [vs Granola](/vs-granola) — meeting notepad vs full screen memory
* [vs Otter.ai](/vs-otter) — cloud transcription vs local capture
* [vs Fathom](/vs-fathom) — meeting bot vs 24/7 capture
* [vs Fireflies.ai](/vs-fireflies) — cloud meeting bot vs local-first
## resources
* [AI meeting notes guide](https://screenpi.pe/resources/use-cases/ai-meeting-notes) - automatic transcription setup
* [local AI assistant setup](https://screenpi.pe/resources/use-cases/local-ai-assistant) - run AI 100% locally
* [screenpipe blog](https://screenpi.pe/blog) - latest updates and tutorials
## frequently asked questions
### how does screenpipe compare to Limitless?
screenpipe captures both screen and audio on your existing devices, while Limitless requires purchasing a pendant and only captures audio. screenpipe is source-available, runs entirely locally, and stores all data on your device by default. Limitless is cloud-based and closed source. screenpipe also offers extensibility through pipes (AI agents) and a full REST API.
### do I need to buy hardware to use screenpipe?
no. screenpipe uses your existing computer, microphone, and webcam. no pendant, wearable, or special hardware required. just [download the desktop app](https://screenpi.pe/onboarding) and start recording.
### can screenpipe replace Limitless for meeting transcription?
yes. screenpipe captures system audio (Zoom, Meet, Teams) and your microphone simultaneously, with automatic transcription and speaker identification. configure audio devices in the desktop app settings. unlike Limitless, all transcriptions stay on your device.
# screenpipe vs Littlebird: local-first vs cloud screen AI
Source: https://docs.screenpipe.com/vs-littlebird
Compare screenpipe and Littlebird: 100% local source-available screen plus audio capture vs a cloud-hosted screen reader. Privacy, data ownership, and features.
Littlebird raised \$11M (March 2026) to build an AI assistant that reads your screen and stores the context in the cloud. screenpipe does the same thing — but stores everything locally, is source-available and auditable, and has a pipe ecosystem for automations.
## comparison
| feature | screenpipe | littlebird |
| ----------------------- | ------------------------------------------------------ | --------------------------------- |
| **data storage** | 100% local on your device | cloud (encrypted) |
| **source access** | source-available, auditable | no |
| **screen capture** | accessibility APIs + OCR fallback, all monitors | reads screen text (no OCR images) |
| **audio transcription** | yes — meetings, calls, conversations | yes |
| **platforms** | macOS, Windows, Linux | macOS only |
| **AI provider** | your choice — local (Ollama), ChatGPT, Claude, any API | their cloud models |
| **extensibility** | 16+ pipes, 45+ app connections, REST API, MCP server | limited |
| **pricing** | see [current pricing](https://screenpi.pe/onboarding) | free + paid plans |
## why screenpipe?
### your data stays on your device
this is the fundamental difference. Littlebird uploads your screen context to the cloud — they say it's encrypted, but your data leaves your machine. screenpipe stores everything in `~/.screenpipe/` on your local disk. nothing leaves your device unless you choose it.
### auditable source
screenpipe is source-available with 17k+ GitHub stars. you can audit the local capture and storage code, self-host the local stack, or contribute to the repo. Littlebird is closed source — you trust their encryption and their servers.
### cross-platform
screenpipe works on macOS, Windows, and Linux. Littlebird is macOS only.
### extensible with pipes
screenpipe has 16+ published pipes (automated AI workflows) — digital clone, CRM sync, time tracking, Obsidian sync, meeting intelligence, and more. plus 45+ app connections (Slack, Notion, Google Calendar, Toggl, HubSpot, etc.). Littlebird has a chat interface but no automation ecosystem.
### choose your AI
use Ollama for 100% local AI, your ChatGPT/Claude subscription, or any API key. Littlebird locks you into their cloud AI.
## when to consider Littlebird
if you don't mind cloud storage and want a simpler, more opinionated product with less configuration, Littlebird's approach is straightforward. it's also free to start.
## more comparisons
* [vs Rewind](/vs-rewind) — local-first alternative
* [vs Microsoft Recall](/vs-recall) — privacy-focused alternative
* [vs Pieces](/vs-pieces) — code snippet manager vs full screen capture
* [vs Granola](/vs-granola) — meeting notepad vs full screen memory
* [vs Omi](/vs-omi) — wearable pendant vs desktop capture
## frequently asked questions
### is screenpipe more private than Littlebird?
yes. screenpipe stores all data locally on your device and its source is available for audit. Littlebird uploads your screen context to cloud servers. even with encryption, your data leaves your machine with Littlebird. with screenpipe, it never does unless you explicitly enable a sync, archive, or cloud AI feature.
### does Littlebird work on Windows?
no. Littlebird is macOS only (as of 2026). screenpipe works on macOS, Windows, and Linux.
### can screenpipe do what Littlebird does?
yes — and more. both read your screen and make it searchable with AI. screenpipe adds audio transcription, cross-platform support, auditable source, 16+ automation pipes, 45+ app integrations, and keeps everything local by default. the main tradeoff is screenpipe requires more setup than Littlebird's simpler out-of-box experience.
# screenpipe vs Omi — desktop capture vs AI wearable
Source: https://docs.screenpipe.com/vs-omi
Compare screenpipe and Omi (formerly Friend): desktop screen and audio capture vs an $89 AI wearable pendant. Two auditable approaches to AI memory.
Omi (formerly Friend, by Based Hardware) is an \$89 open source AI wearable pendant that captures conversations. screenpipe is source-available desktop software that captures your screen and audio 24/7. they capture different parts of your life and can work well together.
## comparison
| feature | screenpipe | omi |
| --------------------- | --------------------------------------------- | ------------------------------ |
| **what it captures** | screen text + audio on your computer | conversations via wearable mic |
| **hardware required** | your existing computer | \$89 pendant |
| **screen capture** | yes — all monitors, all apps | no |
| **audio capture** | system audio + mic on computer | always-on ambient mic on body |
| **data storage** | 100% local | phone + optional cloud |
| **source access** | source-available, auditable | yes (MIT) |
| **platforms** | macOS, Windows, Linux | iOS, Android |
| **AI provider** | your choice (local Ollama, ChatGPT, Claude) | GPT-4o via your API key |
| **extensibility** | 16+ pipes, 45+ app connections, REST API, MCP | developer SDK, community apps |
| **away-from-desk** | no — captures your computer only | yes — captures anywhere you go |
## why screenpipe?
### captures your screen — not just audio
Omi only captures audio from its microphone. screenpipe captures everything on your screen — code, browser tabs, Slack messages, emails, documents — plus audio. when your AI asks "what was I working on?", screenpipe has the visual context, not just what was said.
### no hardware to buy or charge
screenpipe uses your existing computer. no pendant to buy (\$89), charge, or remember to wear.
### pipes ecosystem
screenpipe has 16+ published automations — digital clone, CRM sync, time tracking, meeting intelligence, Obsidian sync. Omi has a developer SDK but fewer ready-to-use automations.
### 45+ app connections
screenpipe connects to Slack, Notion, Google Calendar, Toggl, HubSpot, Salesforce, and more. Omi connects primarily to your phone.
## when to use Omi instead
Omi captures conversations **away from your desk** — walking meetings, coffee chats, phone calls, in-person discussions. screenpipe only captures what happens on your computer. if you need always-on ambient conversation capture wherever you go, Omi fills that gap.
## use both together
the best setup for total recall:
* **screenpipe** captures everything on your computer — screen, audio, meetings
* **Omi** captures conversations when you're away from your desk
screenpipe is source-available and Omi is open source. together, they cover your entire workday — at and away from the computer.
## more comparisons
* [vs Rewind](/vs-rewind) — local-first alternative
* [vs Limitless](/vs-limitless) — another hardware vs software comparison
* [vs Pieces](/vs-pieces) — code snippet manager vs full screen capture
* [vs Littlebird](/vs-littlebird) — cloud screen reader vs local capture
* [vs Granola](/vs-granola) — meeting notepad vs full screen memory
## frequently asked questions
### should I get Omi or screenpipe?
it depends on what you want to capture. screenpipe captures your computer screen + audio — everything you see and hear at your desk. Omi captures conversations wherever you go via a wearable pendant. for desk work (coding, browsing, meetings), screenpipe. for walking meetings and in-person conversations, Omi. many users run both.
### are Omi and screenpipe both auditable?
yes. screenpipe is source-available and Omi is MIT licensed. screenpipe has 17k+ GitHub stars; Omi has 15k+. you can audit both; check each project's license before redistributing or building commercial products on top.
### can screenpipe capture audio like Omi does?
screenpipe captures audio from your computer — system audio (Zoom, Meet, Teams) and your microphone. but it only works when you're at your computer. Omi's pendant captures audio wherever you go, including away from your desk. screenpipe captures more data types (screen + audio); Omi captures in more places.
# screenpipe vs Otter.ai: local screen memory vs meeting bot
Source: https://docs.screenpipe.com/vs-otter
Compare screenpipe and Otter.ai: local 24/7 screen and audio capture vs cloud meeting transcription with a 6000 minute monthly cap and a visible bot.
screenpipe captures your entire screen and audio 24/7, locally, with no caps. Otter.ai is a cloud-based meeting transcription tool that sends a visible bot to your calls and limits you to 6000 minutes per month.
## comparison
| feature | screenpipe | otter.ai |
| -------------------- | ----------------------------------------------------- | --------------------------- |
| **scope** | 24/7 screen + audio | meeting audio only |
| **screen capture** | all monitors, all apps | none |
| **audio limits** | unlimited | 6000 min/mo cap |
| **data storage** | 100% local | cloud (Otter's servers) |
| **source access** | source-available, auditable | no |
| **meeting presence** | invisible (captures on your device) | visible bot joins your call |
| **AI model** | any (Claude, GPT, Ollama, local) | Otter's built-in AI only |
| **price** | see [current pricing](https://screenpi.pe/onboarding) | per-user subscription |
## why screenpipe?
### no bot, no awkward moments
Otter sends a bot that visibly joins your meeting — everyone sees "Otter.ai" pop up. screenpipe captures audio and screen content on your device without joining the call. no notification to other participants.
### unlimited capture, no caps
Otter limits you to 6000 minutes per month. screenpipe runs 24/7 with no time limits — meetings, research, browsing, coding — everything captured automatically.
### screen content, not just audio
when someone shares a spreadsheet and says "look at the Q3 numbers," screenpipe captures both the words and the actual numbers on screen. Otter only gets the audio.
### local-first, auditable
all data stays on your device. source-available with 17k+ GitHub stars. 45+ app integrations and 16+ pipes in the store. full REST API and MCP server for custom workflows.
## get started
[download the desktop app](https://screenpi.pe)
***
## more comparisons
* [screenpipe vs Otter.ai (full comparison)](https://screenpi.pe/blog/screenpipe-vs-otter-ai-2026) - in-depth analysis
* [screenpipe vs Fireflies](https://screenpi.pe/blog/screenpipe-vs-fireflies-2026) - another cloud meeting bot comparison
* [screenpipe vs Granola](https://screenpipe.com/compare/granola) - meeting notepad comparison
* [all comparisons](https://screenpi.pe/compare) - see how screenpipe stacks up
## frequently asked questions
### is screenpipe better than Otter.ai?
screenpipe and Otter.ai solve different problems. Otter is a polished meeting transcription tool with speaker identification and mobile apps. screenpipe captures your entire workday — meetings plus everything else — locally and privately. if you need more than meeting transcription, or if privacy and local storage matter, screenpipe is the better choice.
### does screenpipe send a bot to my meetings?
no. screenpipe captures audio and screen content directly on your device. no bot joins the call, no notification appears for other participants. this is a key difference from Otter.ai, which joins meetings as a visible participant.
### how does screenpipe compare to Otter.ai on price?
Otter is a per-user meeting-transcription subscription. screenpipe pricing changes by plan and use case, so use the [current pricing page](https://screenpi.pe/onboarding) as the source of truth. the practical comparison is that screenpipe covers screen, audio, meetings, local storage, pipes, and API access, while Otter focuses on meeting transcription.
# screenpipe vs Pieces: screen capture vs code snippets
Source: https://docs.screenpipe.com/vs-pieces
Compare screenpipe to Pieces for Developers. Full screen capture vs code snippet manager. screenpipe captures everything — Pieces only sees your editor.
Pieces for Developers is a code snippet manager and AI copilot that lives inside your IDE. screenpipe captures your entire screen and audio 24/7 — every app, every window, every conversation. they solve different problems and many developers use both.
## comparison
| feature | screenpipe | pieces |
| ---------------------------- | ------------------------------------------------------------ | ------------------------------ |
| **what it captures** | entire screen + audio 24/7 | code snippets from your editor |
| **screen recording** | all monitors, all apps | none |
| **audio transcription** | yes — meetings, calls, conversations | none |
| **browser, Slack, terminal** | yes — captures everything on screen | no — editor plugins only |
| **source access** | source-available, auditable | partially open source |
| **data location** | 100% local | local + optional cloud sync |
| **platforms** | macOS, Windows, Linux | macOS, Windows, Linux |
| **AI integrations** | MCP server for Claude, Cursor, ChatGPT + 45+ app connections | MCP server, IDE plugins |
| **extensibility** | 16+ pipes (scheduled AI agents) | snippet-focused workflows |
| **pricing** | see [current pricing](https://screenpi.pe/onboarding) | free tier + paid Pro |
## why screenpipe?
### captures everything, not just code
Pieces only sees what's inside your editor. screenpipe captures your browser research, Slack conversations, Zoom calls, terminal output, design tools — everything on your screen. when your AI asks "what was I working on?", screenpipe has the full picture.
### audio + meetings
screenpipe transcribes all audio — meetings, calls, pair programming sessions. Pieces has no audio capabilities. when someone mentions a deadline in a Zoom call, screenpipe captures it.
### pipes — automated workflows
screenpipe's pipe ecosystem (16+ published pipes, 574+ installs on the most popular) automates workflows: time tracking, CRM sync, daily summaries, meeting intelligence. Pieces doesn't have scheduled automations on your screen data.
### 45+ app connections
screenpipe connects to Slack, Notion, Google Calendar, Obsidian, Toggl, HubSpot, Salesforce, and 40+ more apps. Pieces connects primarily to IDEs.
## when to use Pieces instead
Pieces excels at **code snippet management** — it parses code, extracts metadata (language, repo context, related docs), and organizes snippets with tags. if your primary need is saving and finding code snippets inside your editor, Pieces is purpose-built for that.
## use both together
many developers run both:
* **Pieces** for snippet management inside the editor
* **screenpipe** for everything else — meetings, browser research, Slack, the full visual timeline of your day
they complement each other. screenpipe gives your AI the full context of your workday; Pieces gives deep code-specific context in your IDE.
## more comparisons
* [vs Rewind](/vs-rewind) — local-first alternative
* [vs Microsoft Recall](/vs-recall) — privacy-focused alternative
* [vs Granola](/vs-granola) — meeting notepad vs full screen memory
* [vs Limitless](/vs-limitless) — hardware vs software
* [vs Littlebird](/vs-littlebird) — cloud screen reader vs local capture
* [vs Omi](/vs-omi) — wearable pendant vs desktop capture
## frequently asked questions
### is screenpipe better than Pieces for Developers?
they solve different problems. screenpipe captures your entire screen and audio 24/7 — everything you see, say, or hear. Pieces manages code snippets inside your IDE. screenpipe is better for full-context AI memory, meeting transcription, and automated workflows. Pieces is better for code snippet organization. many developers use both.
### can screenpipe replace Pieces?
for code snippet management inside your editor, Pieces is more specialized. but for everything Pieces can't do — screen capture, audio transcription, meeting notes, time tracking, CRM sync, browser research recall — screenpipe fills the gap. if you want one tool for everything, screenpipe covers more ground.
### does screenpipe work with Cursor and Claude Code like Pieces does?
yes. screenpipe has an MCP server that works with Claude Desktop, Claude Code, Cursor, Cline, Continue, Gemini CLI, and more. your AI coding assistant can search your full screen history, not just code snippets.
# screenpipe vs Microsoft Recall - privacy-focused alternative
Source: https://docs.screenpipe.com/vs-recall
Compare screenpipe and Microsoft Recall: a source-available Windows Recall alternative that runs on Mac, Windows, and Linux with no cloud dependency.
Microsoft Recall is a Windows 11 feature that captures screenshots and makes them searchable. screenpipe offers similar functionality but with complete privacy, auditable source, and cross-platform support.
## comparison
| feature | screenpipe | microsoft recall |
| ----------------- | ---------------------------- | --------------------------- |
| **source access** | source-available, auditable | no |
| **platforms** | macOS, Windows, Linux | Windows 11 only |
| **data location** | 100% local | local (with cloud concerns) |
| **NPU required** | no | yes (Copilot+ PCs) |
| **privacy** | auditable source code | closed source |
| **AI provider** | your choice (local or cloud) | Microsoft AI |
| **extensibility** | plugins (pipes) | none |
## why choose screenpipe?
### true privacy
* source-available: you can audit the local capture and storage code
* no Microsoft account required
* no telemetry or data collection
* use completely local AI (Ollama)
### works everywhere
* macOS, Windows, Linux
* no special hardware required
* runs on any modern computer
### you control the AI
* use Ollama for 100% local AI
* or connect to OpenAI, Claude, etc.
* your choice, not Microsoft's
### extensible
build custom integrations with the REST API or [pipes](/pipes):
```bash theme={null}
curl "http://localhost:3030/search?q=meeting+notes&content_type=all"
```
## recall privacy concerns
Microsoft Recall has faced criticism for:
* storing sensitive data (passwords, financial info)
* potential security vulnerabilities
* data being accessible to other apps
* unclear data handling policies
screenpipe addresses these:
* **PII removal**: optional automatic redaction of sensitive data
* **window filtering**: exclude apps like password managers
* **local-only**: data never leaves your device
* **source-available**: security researchers can audit the local capture and storage code
## filtering sensitive content
in the desktop app settings, you can exclude specific windows (like password managers and banking apps) and enable PII removal to automatically redact sensitive data.
## get started
[download the desktop app](https://screenpi.pe)
***
## more comparisons
* [vs Rewind](/vs-rewind) — local-first alternative
* [vs Limitless](/vs-limitless) — hardware vs software
* [vs Granola](/vs-granola) — meeting notepad vs full screen memory
* [vs Otter.ai](/vs-otter) — cloud transcription vs local capture
* [vs Fathom](/vs-fathom) — meeting bot vs 24/7 capture
* [vs Fireflies.ai](/vs-fireflies) — cloud meeting bot vs local-first
## resources
* [AI recall tools guide](https://screenpi.pe/resources/use-cases/ai-recall-tools) - how screen memory works
* [local AI assistant setup](https://screenpi.pe/resources/use-cases/local-ai-assistant) - complete privacy with Ollama
* [screenpipe blog](https://screenpi.pe/blog) - latest updates and tutorials
## frequently asked questions
### is there a privacy-focused alternative to Windows Recall?
yes. screenpipe is the privacy-focused, source-available alternative to Microsoft Recall. unlike Recall, screenpipe works on macOS, Windows, and Linux, requires no special hardware (no NPU needed), and stores all data locally by default with no cloud dependency. you can use local AI models (Ollama) for complete privacy and audit the local capture and storage code.
### does screenpipe work on Windows without a Copilot+ PC?
yes. screenpipe runs on any modern Windows computer — no NPU or Copilot+ hardware required. it uses Windows accessibility APIs for structured app text, with CPU-based OCR fallback, and works on Windows 10 and 11.
### how is screenpipe different from Windows Recall?
screenpipe is source-available, cross-platform, and has no cloud dependency by default. Recall is closed source, Windows 11 only, requires Copilot+ hardware, and has faced privacy concerns. screenpipe also offers extensibility through pipes (scheduled AI agents) and a full REST API that Recall doesn't provide.
# screenpipe vs Rewind.ai - local-first alternative
Source: https://docs.screenpipe.com/vs-rewind
Compare screenpipe and Rewind.ai: a source-available, local-first, cross-platform Rewind alternative now that Rewind has pivoted to Limitless.
screenpipe is the local-first alternative to Rewind.ai. after Rewind pivoted to Limitless and discontinued its desktop app, screenpipe continues to provide 24/7 screen memory with complete privacy and auditable source.
## comparison
| feature | screenpipe | rewind.ai |
| ----------------- | --------------------------- | ----------------------------------- |
| **source access** | source-available, auditable | no |
| **data location** | 100% local | local |
| **platforms** | macOS, Windows, Linux | macOS only |
| **status** | active | discontinued (pivoted to Limitless) |
| **extensibility** | plugins (pipes) | limited |
| **self-hosted** | yes | no |
| **API access** | full REST API | limited |
## why screenpipe?
### auditable source
screenpipe is source-available. audit the code, contribute, or fork it. your data, your control.
### cross-platform
works on macOS, Windows, and Linux. rewind was mac-only.
### extensible
build custom plugins (pipes) with TypeScript and Next.js. integrate with any service.
### active development
16k+ GitHub stars, 80+ contributors. actively maintained and improved.
### privacy-first
* all processing happens locally
* use local LLMs (Ollama) for complete privacy
* no telemetry or data collection
* you can audit the source code
### advanced search & memory
screenpipe goes beyond simple text matching:
* **semantic search**: find moments by meaning, not just keywords. e.g. "times when I was confused" or "design discussions with my team" works even if exact words aren't present
* **timeline DVR**: scroll through your day visually like a DVR, click any moment for full-resolution screenshots and transcription
* **multi-modal filtering**: narrow by app, window title, URL, date range, or even screen regions
* **transcript search**: speaker-identified transcriptions make it easy to find who said what in meetings
## why Rewind users are switching
after Rewind.ai discontinued its desktop app and pivoted to Limitless (a hardware device), many Rewind users switched to screenpipe for these reasons:
* **actively maintained**: unlike Rewind, screenpipe has ongoing development, feature updates, and bug fixes. your investment in the tool won't be abandoned.
* **true cross-platform**: Rewind was macOS-only. screenpipe works on macOS, Windows, and Linux — take your screen memory with you across any device.
* **free local option**: Rewind required a paid subscription. screenpipe offers a CLI and local source builds, while paid plans add packaged distribution, support, and advanced features.
* **extensibility**: Rewind had limited customization. screenpipe lets you build custom pipes and use the full REST API to integrate with any tool or workflow.
* **local-first by default**: both capture locally, but screenpipe makes it easier to opt-out of cloud AI entirely — use local Ollama for zero data egress.
## migrating from rewind
if you were a Rewind user:
1. [install screenpipe](/getting-started)
2. use the built-in timeline view for a familiar interface
3. your future screen activity will be captured locally
## features rewind users love
* **timeline view**: scroll through your day visually — same DVR-like experience as Rewind, now with cross-platform support
* **natural language search**: "find the email I was reading yesterday" + semantic search understands context and meaning
* **meeting transcription**: automatic transcription with speaker identification — easily identify who said what
* **AI integration**: connect to ChatGPT, Claude, or local Ollama for full privacy — deeper integration than Rewind's assistant
* **always-on capture**: 24/7 recording with zero-cost local processing (no cloud dependency like Rewind had)
## get started
[download the desktop app](https://screenpi.pe)
***
## more comparisons
* [vs Microsoft Recall](/vs-recall) — privacy-focused alternative
* [vs Limitless](/vs-limitless) — hardware vs software
* [vs Granola](/vs-granola) — meeting notepad vs full screen memory
* [vs Otter.ai](/vs-otter) — cloud transcription vs local capture
* [vs Fathom](/vs-fathom) — meeting bot vs 24/7 capture
* [vs Fireflies.ai](/vs-fireflies) — cloud meeting bot vs local-first
## resources
* [Rewind alternative guide](https://screenpi.pe/resources/use-cases/open-source-rewind-alternative) - complete migration guide
* [screenpipe blog](https://screenpi.pe/blog) - latest updates and tutorials
## frequently asked questions
### what is the best source-available alternative to Rewind.ai?
screenpipe is a popular source-available alternative to Rewind.ai with 16k+ GitHub stars. it captures your screen 24/7, reads app text through accessibility APIs with OCR fallback, transcribes audio, and makes everything searchable — all running locally on your device. unlike Rewind (which has been discontinued), screenpipe is actively maintained, works on macOS, Windows, and Linux, and is fully extensible with plugins (pipes) and a REST API.
### is Rewind.ai still available?
no. Rewind.ai pivoted to Limitless and discontinued the desktop screen recording app. screenpipe is the actively maintained replacement that provides the same 24/7 screen capture and search functionality, plus cross-platform support and auditable source.
### can I migrate from Rewind to screenpipe?
yes. [install screenpipe](/getting-started), and it will start capturing your screen activity going forward. screenpipe provides a familiar timeline view and natural language search. while historical Rewind data can't be imported, all future activity will be captured and searchable locally.
# discover work worth automating
Source: https://docs.screenpipe.com/workflow-discovery
Observe a few real screenpipe recordings to find one repeated workflow, measure its friction and handoffs, and turn activity into an automation candidate.
workflow discovery is useful for consultants, operators, and small teams who know work feels repetitive but cannot yet describe what should be automated. use screenpipe to observe a few real repetitions, then choose one narrow improvement.
## the output
a useful discovery report names:
* the trigger and desired result
* the systems and handoffs involved
* the repeated steps and decisions
* frequency and approximate active time
* errors, waiting, copying, and rework
* one candidate improvement with a human owner
* evidence gaps that need another observation
```mermaid theme={null}
flowchart TD
A["observe 2–3 real runs"] --> B["find repeated steps"]
B --> C["measure friction and exceptions"]
C --> D["rank candidates"]
D --> E["choose one small change"]
E --> F["test against an accepted result"]
```
## step by step
Use a concrete boundary such as “turn a support request into a resolved ticket” or “prepare the weekly client report.” avoid broad goals such as “analyze the company.”
Tell participants what is recorded, why, who can review it, how long it is retained, and how to pause or exclude sensitive apps. do not use this workflow for covert employee monitoring.
Record enough examples to see normal variation. note the approximate start and end of each run so the search windows stay bounded.
Use **Automate My Work** on Home. for a reusable version, open **Pipes → My Pipes → create your own pipe** and describe the bounded discovery report below. if it reports no matching data, fix capture or widen the range; do not fill gaps with assumptions.
Remove one-off tasks and anything that depends on judgment the data does not expose. rank the rest by frequency, active time, failure cost, and ease of testing.
Turn the best candidate into a draft SOP before automating it. include triggers, steps, decisions, exceptions, inputs, and the accepted result.
Automate a single stable step or add a checklist. compare the result with the original process before expanding the scope.
## build a reusable discovery pipe
paste this into **Pipes → My Pipes → create your own pipe**:
```text theme={null}
Create a manual workflow-discovery pipe for one named outcome.
Review a bounded time window and write a local Markdown report.
List only workflows repeated in the supplied data.
For each candidate include trigger, result, observed steps, repetitions,
friction, exceptions, evidence time ranges, and one reversible improvement.
Use /activity-summary for time totals. Do not score employee productivity,
send messages, or change another system.
```
after the app builds it, return to **My Pipes**, run it manually, and inspect both the report and execution log before scheduling it.
## prompt for a discovery pass
```markdown theme={null}
Analyze these bounded screenpipe results for repeated workflows.
For each candidate, provide:
- trigger and intended result
- observed steps and apps
- number of observed repetitions
- approximate active time, using activity-summary values only
- friction, rework, handoffs, and exceptions
- evidence moments or time ranges
- a small improvement to test
- missing evidence
Rank only workflows directly supported by the data.
If evidence is insufficient, say so.
Do not score employee productivity.
```
## choose a candidate
| good first candidate | poor first candidate |
| --------------------------------- | ------------------------------------------------------- |
| repeated at least a few times | happened once |
| clear trigger and accepted result | success is subjective or political |
| mostly stable steps | exceptions dominate the process |
| easy to verify | failure would create financial, legal, or customer harm |
| reversible change | irreversible external action |
once you understand the current process, use [SOP capture](/team-sop-capture) to make the operating guide precise.